2017-03-11 1 views
1

Ich verwende Jackson 2 Bibliothek deserialisieren und ich versuche, eine JSON-Antwort zu lesen, die wie folgt aussieht:Verwenden Jackson JSON-String oder ein Objekt in ein String-Feld

{ "value":"Hello" } 

Wenn der Wert leer ist, JSON-Antwort aussehen wie:

{ "value":{} } 

Mein Modell POJO Klasse wie dieses

public class Hello { 

    private String value; 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 

} 

Das Problem sieht i s, dass, wenn Reaktion aussieht {Wert: {}}, Jackson, ein Objekt zu lesen versucht, aber mein Modell Klassenfeld ist ein String, so wirft es eine Ausnahme:

JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token. 

Meine Frage ist, wie Jackson erfolgreich lesen JSONs, die wie folgt aussehen:

{"value":"something"} 

und zugleich, wenn Reaktion dieser aussieht { „Wert“: {}} (leere Antwort für mich), übergeben zu Wertfeld meines Hallo Modellklasse null.

Ich verwende den Code unten, um JSON-String zu lesen:

String myJsonAsString = "{...}"; 
ObjectMapper mapper = new ObjectMapper(); 
mapper.readValue(myJsonAsString , Hello.class); 
+0

Gibt es keine Möglichkeit, das Teil zu reparieren, das dieses JSON generiert, anstatt um dieses hässliche Design herum zu arbeiten? –

+0

Nö gibt es leider nicht. API gehört nicht mir. Ich bin nur die Kundenseite. –

+0

Autsch, die richtige Ausgabe würde das Feld auslassen oder auf Null setzen ... – john16384

Antwort

3

Sie einen benutzerdefinierten Deserializer für dieses Feld verwenden kann. Hier ist eine, die die Zeichenfolge zurückgibt, wenn sie dort ist, oder Null in jedem anderen Fall:

public class Hello { 

    @JsonDeserialize(using = StupidValueDeserializer.class) 
    private String value; 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 
} 

public class StupidValueDeserializer extends JsonDeserializer<String> { 
    @Override 
    public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException { 
     JsonToken jsonToken = p.getCurrentToken(); 
     if (jsonToken == JsonToken.VALUE_STRING) { 
      return p.getValueAsString(); 
     } 
     return null; 
    } 
} 
+0

Vielen Dank, es löst meinen Fall perfekt. –

Verwandte Themen