2015-06-15 7 views
6

Ich versuche eine einfache JSON in Java-Objekt zu deserialisieren. Ich bekomme jedoch String-Werte für java.lang.String-Eigenschaftswerte leer. In den restlichen Eigenschaften werden leere Werte in Nullwerte umgewandelt (was ich möchte).wie ein deserialize eine leere JSON Zeichenfolge Wert auf null für java.lang.String

meine Json und Java-Klasse sind im Folgenden aufgeführt:

Json string:

{ 
    "eventId" : 1, 
    "title" : "sample event", 
    "location" : "" 
} 

Java-Code:

EventBean Klasse Pojo:

public class EventBean { 


    public Long eventId; 
    public String title; 
    public String location; 

} 

Mein Hauptklassencode:

ObjectMapper mapper = new ObjectMapper(); 
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); 
mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT); 

    try { 

     File file = new File(JsonTest.class.getClassLoader().getResource("event.txt").getFile()); 

     JsonNode root = mapper.readTree(file); 
     // find out the applicationId 

     EventBean e = mapper.treeToValue(root, EventBean.class); 
     System.out.println("it is"+  e.location); 

Ich erwartete Druck "Is is null". Stattdessen bekomme ich "Es ist". Offensichtlich behandelt jackson keine leeren String-Werte als Null während der Konvertierung in meinen java.lang.String-Objekttyp. Ich habe irgendwo gelesen, dass es erwartet wird. Das möchte ich aber auch für java.lang.String vermeiden. Gibt es einen einfachen Weg?

Antwort

4

Jackson wird Ihnen Null für andere Objekte geben, aber für String wird es leere Zeichenfolge geben.

Aber Sie können eine benutzerdefinierte JsonDeserializer, dies zu tun verwenden:

class CustomDeserializer extends JsonDeserializer<String> { 

    @Override 
    public String deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException, JsonProcessingException { 
     JsonNode node = jsonParser.readValueAsTree(); 
     if (node.asText().isEmpty()) { 
      return null; 
     } 
     return node.toString(); 
    } 

} 

In der Klasse Sie es für Standortfeld verwenden müssen:

class EventBean { 
    public Long eventId; 
    public String title; 

    @JsonDeserialize(using = CustomDeserializer.class) 
    public String location; 
} 
+0

danke Sachin. Das sollte funktionieren. – Mayur

+2

Das funktionierte auch für mich, aber mit readValueAsTree() wurde die Zeichenfolge in zusätzliche Anführungszeichen eingeschlossen. Um es zu vermeiden, habe ich stattdessen jsonParser.readValueAs (String.class); – kopelitsa

+0

@kopelitsa zusätzliche Anführungszeichen Problem konnte behoben werden durch "return node.asText();" – gce

3

Es ist möglich, eine benutzerdefinierte Deserializer für die definieren Zeichenkettentyp, überschreibt den Standard-String-Deserializer:

this.mapper = new ObjectMapper(); 

SimpleModule module = new SimpleModule(); 

module.addDeserializer(String.class, new StdDeserializer<String>(String.class) { 

    @Override 
    public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException { 
     String result = StringDeserializer.instance.deserialize(p, ctxt); 
     if (StringUtils.isEmpty(result)) { 
      return null; 
     } 
     return result; 
    } 
}); 

mapper.registerModule(module); 

Auf diese Weise alle String-Felder verhalten sich genauso.

Verwandte Themen