2013-12-18 2 views
3

у меня есть следующий класс, который сопоставляется Джексоном (упрощенная версия):Джексон: десериализации пустых строк как пустые строки

public class POI { 
    @JsonProperty("name") 
    private String name; 
} 

В некоторых случаях сервер возвращает "name": null и я хотел бы, чтобы затем установить имя пустая строка Java.

Есть ли какие-либо аннотации Джексона, или я должен просто проверить нуль внутри моего получателя и вернуть пустую строку, если свойство null?

+0

ОК это дубликат :-) http://stackoverflow.com/questions/5782284/how-to-serialize-in-jackson-json-null-string-to-empty-string – spa

ответ

3

Вы можете установить его в конструктор по умолчанию, или об объявлении:

public class POI { 
    @JsonProperty("name") 
    private String name; 

    public POI() { 
     name = ""; 
    } 
} 

ИЛИ

public class POI { 
    @JsonProperty("name") 
    private String name = ""; 
} 
+0

Значение по умолчанию работало как Шарм! – mrvincenzo

6

Простое решение, не использующее фирменные блюда Джексона: Напишите Getter для имени, которое возвращает пустую строку вместо нуля, поскольку Джексон использует те, которые используются для сериализации.

public String getName() { 
    return name != null ? name : ""; 
} 

Другой способ - написать собственный десериализатор. Посмотрите здесь: http://wiki.fasterxml.com/JacksonHowToCustomSerializers

0

Опять же, это ответ на SO пользователей, которые происходят наткнуться на эту нить.

Хотя принятые ответ стенды принятые и действующие во всех его смысле - это не помогло мне в том случае, когда решение установить null строковые значения в empty строки пришли только после того, как мы сделали наши услуги доступными для iOS клиентов.

Итак, около 30-40 pojo (увеличение) и их инициализация при создании экземпляра объекта, о котором идет речь, или в точке объявления было слишком много.

Вот как мы это сделали.

public class CustomSerializerProvider extends DefaultSerializerProvider { 

    public CustomSerializerProvider() { 
     super(); 
    } 

    public CustomSerializerProvider(CustomSerializerProvider provider, SerializationConfig config, 
      SerializerFactory jsf) { 
     super(provider, config, jsf); 
    } 

    @Override 
    public CustomSerializerProvider createInstance(SerializationConfig config, SerializerFactory jsf) { 
     return new CustomSerializerProvider(this, config, jsf); 
    } 

    @Override 
    public JsonSerializer<Object> findNullValueSerializer(BeanProperty property) throws JsonMappingException { 
     if (property.getType().getRawClass().equals(String.class)) 
      return Serializers.EMPTY_STRING_SERIALIZER_INSTANCE; 
     else 
      return super.findNullValueSerializer(property); 
    } 
} 

И сериализатор

public class Serializers extends JsonSerializer<Object> { 
    public static final JsonSerializer<Object> EMPTY_STRING_SERIALIZER_INSTANCE = new EmptyStringSerializer(); 

    public Serializers() {} 

    @Override 
    public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) 
      throws IOException, JsonProcessingException { 
     jsonGenerator.writeString(""); 
    } 

    private static class EmptyStringSerializer extends JsonSerializer<Object> { 
     public EmptyStringSerializer() {} 

     @Override 
     public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) 
       throws IOException, JsonProcessingException { 
      jsonGenerator.writeString(""); 
     } 
    } 
} 

И, затем установите сериалайзер в ObjectMapper. (Джексон 2.7.4)

ObjectMapper nullMapper = new ObjectMapper(); 
nullMapper.setSerializerProvider(new CustomSerializerProvider()); 

Надеясь, это сэкономит кому-то какое-то время.

Смежные вопросы