2015-06-15 9 views
6

Próbuję prosty json, aby odseparować do obiektu java. Jednak otrzymuję puste wartości ciągów dla wartości właściwości java.lang.String. W pozostałych właściwościach puste wartości są przekształcane na wartości null (co jest tym, czego chcę).jak deserializować pustą wartość łańcucha json na wartość null dla java.lang.String

mój Json i klasy Java są wymienione poniżej:

ciąg JSON:

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

kod Java:

EventBean klasa Pojo:

public class EventBean { 


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

} 

Główny kod klasy:

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); 

Spodziewałem się wydruku "Is is null". Zamiast tego otrzymuję "To jest". Oczywiście, jackson nie traktuje pustych wartości String jako Null podczas konwersji do mojego typu obiektu java.lang.String. Czytałem gdzieś, że się tego oczekuje. Jednak jest to coś, czego chcę uniknąć również dla java.lang.String. czy istnieje prosty sposób?

Odpowiedz

4

Jackson da ci null dla innych obiektów, ale dla String da pusty String.

Ale można użyć niestandardowego JsonDeserializer to zrobić:

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(); 
    } 

} 

W klasie trzeba użyć go do pola lokalizacji:

class EventBean { 
    public Long eventId; 
    public String title; 

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

dzięki Sachin. To powinno działać. – Mayur

+2

To działało również dla mnie, ale używanie readValueAsTree() zawijało łańcuch w dodatkowe cudzysłowy. Aby tego uniknąć użyłem zamiast niego jsonParser.readValueAs (String.class); – kopelitsa

+0

Problem z dodatkowymi cudzysłowami @kopelitsa może zostać rozwiązany przez "return node.asText();" – gce

3

Jest możliwe zdefiniowanie niestandardowego Deserializator dla Typ ciągu, przesłonięcie standardowego deserializatora ciągu:

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); 

W ten sposób wszystkie Pola ciągów będą zachowywać się w ten sam sposób.

Powiązane problemy