59

Map<String,Foo> foosMapジャクソンを介してシリアル化したいAAがあります。ここで、シリアル化プロセスで次の2つの設定を行います。

  1. マップには多くのnull値とnullキーを含めることができ、nullをシリアル化したくありません。
  2. シリアル化されるすべてのFooについて、Foo内で参照されるnullオブジェクトをシリアル化したくありません。

これを達成するための最良の方法は何ですか?プロジェクトでjackson-core1.9およびjackson-mapper1.9jarを使用しています。

4

4 に答える 4

126

元のデータ構造をシリアライズするように変更して、シリアライズしたい実際の値をより適切に表現することが合理的でMapある場合、それはおそらくまともなアプローチであり、必要なジャクソン構成の量を減らす可能性があります。たとえば、nullJackson に電話する前に、可能であればキー エントリを削除してください。それは言った...


Mapnull 値を持つエントリのシリアル化を抑制するには:

Jackson 2.9以前

を引き続き使用できますがWRITE_NULL_MAP_VALUES、次の場所に移動したことに注意してくださいSerializationFeature

mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false);

Jackson 2.9以降

は非推奨です。WRITE_NULL_MAP_VALUES以下の同等のものを使用できます。

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

null 値を持つプロパティのシリアル化を抑制するには、直接設定するObjectMapperか、@JsonIncludeアノテーションを利用できます。

mapper.setSerializationInclusion(Include.NON_NULL);

また:

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

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

私が理解しているように、 nullMapキーを処理するには、いくつかのカスタムシリアル化が必要です。

キーを空の文字列としてシリアル化する簡単な方法null(前述の 2 つの構成の完全な例を含む):

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には、さらにカスタムのシリアル化処理が必要になります。

于 2012-07-13T06:04:05.933 に答える
19

Jackson バージョン < 2.0 の場合、シリアル化されるクラスでこの注釈を使用します。

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
于 2013-03-20T14:10:25.100 に答える
3

答えは少し古いようです。私がしたことは、このマッパーを使用して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);
于 2014-09-04T07:57:35.037 に答える
0

私の解決策、
カスタム 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
}

}

于 2017-04-17T07:20:08.160 に答える