Как предотвратить сериализацию через Джексона нулевых значений внутри карты и пустых полей внутри бина

У меня естьMap<String,Foo> foosMap что я хочу сериализовать через Джексона. Теперь я хочу следующие две настройки в процессе сериализации:

The Map can have have plenty of null values and null keys and I don't want nulls to be serialized. For all those Foos that are getting serialized, I do not want to serialize null objects referenced inside Foo.

Каков наилучший способ достичь этого? Я использую банки jaxon-core1.9 и jackson-mapper1.9 в моем проекте.

 Inquisitive12 июл. 2012 г., 11:51
@dbf не совсем. пожалуйста, посмотрите отредактированный заголовок вопроса снова.
 Inquisitive12 июл. 2012 г., 11:57
@dbf Такжеthat method в принятом ответе кажется устаревшим
 amicngh12 июл. 2012 г., 11:50
Карта может иметь не более одного нулевого ключа
 dbf12 июл. 2012 г., 11:50
Возможно дублирование, пожалуйста, проверьте эту ссылку:stackoverflow.com/questions/3140563/…

Ответы на вопрос(4)

Для версий Jackson & lt; 2.0 используйте эту аннотацию для сериализуемого класса:

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
 05 янв. 2018 г., 21:52
Я подтверждаю с Джексоном 1.9.x, @JsonInclude (Include.NON_NULL) не работает. Я импортирую этот пакет: org.codehaus.jackson.map
 30 нояб. 2015 г., 18:47
К вашему сведению, это не рекомендуется, принятый ответ имеет последнюю аннотацию: @JsonInclude (Include.NON_NULL)
 16 мар. 2016 г., 18:24
Обратите внимание, что аннотация JsonInclude недоступна, если вы используете Jackson 1.9.x, и в этом случае вам придется использовать аннотацию JsonSerialize.

Ответ, кажется, немного стар, Что я сделал, чтобы использовать этот картограф для преобразованияMAP

      ObjectMapper mapper = new ObjectMapper().configure(SerializationConfig.Feature.WRITE_NULL_MAP_VALUES, false);

простоMap:

          Map<String, Object> user = new HashMap<String,Object>();
            user.put( "id",  teklif.getAccount().getId() );
            user.put( "fname", teklif.getAccount().getFname());
            user.put( "lname", teklif.getAccount().getLname());
            user.put( "email", teklif.getAccount().getEmail());
            user.put( "test", null);

Используйте это, например, так:

      String json = mapper.writeValueAsString(user);
Решение Вопроса

Если разумно изменить оригиналMap структура данных, которая должна быть сериализована, чтобы лучше представлять фактическое значение, которое требуется сериализовать, это, вероятно, достойный подход, который, возможно, уменьшит количество необходимой конфигурации Джексона. Например, просто удалитеnull ключевые записи, если это возможно, перед вызовом Джексона. Это сказал ...

Подавить сериализациюMap записи с нулевыми значениями:

Before Jackson 2.9

вы все еще можете использоватьWRITE_NULL_MAP_VALUES, но обратите внимание, что он перемещен вSerializationFeature:

mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false);

Since Jackson 2.9

WRITE_NULL_MAP_VALUES устарела, вы можете использовать следующий эквивалент:

mapper.setDefaultPropertyInclusion(
   JsonInclude.Value.construct(Include.ALWAYS, Include.NON_NULL))

Чтобы подавить сериализацию свойств с нулевыми значениями, вы можетенастроитьObjectMapper directlyили использовать@JsonInclude аннотация:

mapper.setSerializationInclusion(Include.NON_NULL);

или же:

@JsonInclude(Include.NON_NULL)
class Foo
{
  public String bar;

  Foo(String bar)
  {
    this.bar = bar;
  }
}

Обрабатывать нольMap ключи, некоторые пользовательские сериализации необходимы, насколько я понимаю.

Простой подход к сериализацииnull ключи как пустые строки (включая полные примеры двух ранее упомянутых конфигураций):

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.SerializerProvider;

public class JacksonFoo
{
  public static void main(String[] args) throws Exception
  {
    Map<String, Foo> foos = new HashMap<String, Foo>();
    foos.put("foo1", new Foo("foo1"));
    foos.put("foo2", new Foo(null));
    foos.put("foo3", null);
    foos.put(null, new Foo("foo4"));

    // System.out.println(new ObjectMapper().writeValueAsString(foos));
    // Exception: Null key for a Map not allowed in JSON (use a converting NullKeySerializer?)

    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false);
    mapper.setSerializationInclusion(Include.NON_NULL);
    mapper.getSerializerProvider().setNullKeySerializer(new MyNullKeySerializer());
    System.out.println(mapper.writeValueAsString(foos));
    // output: 
    // {"":{"bar":"foo4"},"foo2":{},"foo1":{"bar":"foo1"}}
  }
}

class MyNullKeySerializer extends JsonSerializer<Object>
{
  @Override
  public void serialize(Object nullKey, JsonGenerator jsonGenerator, SerializerProvider unused) 
      throws IOException, JsonProcessingException
  {
    jsonGenerator.writeFieldName("");
  }
}

class Foo
{
  public String bar;

  Foo(String bar)
  {
    this.bar = bar;
  }
}

Подавить сериализациюMap записи сnull ключи, дальнейшая пользовательская обработка сериализации будет необходимо.

 03 июл. 2018 г., 18:51
@AidenZhao - у меня есть Джексон 2.9.2. Моя IDE, Intellij IDEA, не отображает никакой метод с именем & quot; setDefaultPropertyInclusion & quot; для com.fasterxml.jackson.databind.ObjectMapper. Я что-то пропустил ?
 03 апр. 2013 г., 22:15
Просто предостережение, что эти направления являются специфическими для Джексона 2.0 (com.fasterxml противorg.codehaus).
 13 янв. 2018 г., 00:32
Я нахожу эквивалент WRITE_NULL_MAP_VALUES с версии 2.9:mapper.setDefaultPropertyInclusion(JsonInclude.Value.construct(Include.ALWAYS, Include.NON_NULL))
 12 янв. 2018 г., 20:32
@ProgrammerBurce - поскольку Джексон обновился до 2.9, WRITE_NULL_MAP_VALUES устарела. Знаете ли вы, есть ли альтернативный способ сделать то же самое?
 09 дек. 2016 г., 07:55
@ProgrammerBruce - возможно ли предотвратить сериализацию нулевого поля для определенного класса в объекте отображения? Например: использовать тот же объект сопоставления для сериализации класса A и B, но только нулевые поля в классе B игнорируются.

мое решение, надеюсь, поможет
пользовательский ObjectMapper и config для Spring xml (зарегистрировать конвертеры сообщений)

public class PyResponseConfigObjectMapper extends ObjectMapper {
public PyResponseConfigObjectMapper() {
    disable(SerializationFeature.WRITE_NULL_MAP_VALUES); //map no_null
    setSerializationInclusion(JsonInclude.Include.NON_NULL); // bean no_null
}

}

Ваш ответ на вопрос