2016-08-02 20 views
2

私はJSONに私のPOJOを変換するために、ジャクソンJSONライブラリを使用しています:SerializeをネストされたオブジェクトのJSONジャクソン

public class A { 
     public String name; 
     public B b; 
    } 

    public class B { 
     public Object representation; 
     public String bar; 
    } 

私はJSONへAのインスタンスをシリアル化します。私はJacksonからObjectMapperクラスを使用するつもりです:

例:@XmlRootElement@XmlTypeなどの注釈を持つすべてのこれらのあるJAXBクラスとしてルート要素をピックアップイントロスペクタ

ここ
objectMapperPropertiesBuilder.setSerializationFeature(SerializationFeature.WRAP_ROOT_VALUE); 
objectMapperPropertiesBuilder.setAnnotationIntrospector(new CustomAnnotionIntrospector()); 

注釈を私はObjectに設定した場合表現:このコードを使用して

public class C { 
     public BigInteger ste; 
     public String cr; 
    } 

、私のJSONは次のようになります。

rootA: { 
    "name": "MyExample", 
    "b": { 
    "rep": { 
     "ste": 7, 
     "cr": "C1" 
    }, 
    "bar": "something" 
    } 
} 

しかし、ルート要素をネストされたObjectに追加します。 Objectには任意のカスタムPOJOを使用できます。

この場合、JSON変換ではCクラスのルート要素を追加します。したがって:

rootA: { 
    "name": "MyExample", 
    "b": { 
    "rep": { 
     "rootC": { 
     "ste": 7, 
     "cr": "C1" 
     } 
    }, 
    "bar": "something" 
    } 
} 

JSON変換でネストされたオブジェクトのルート要素を追加するにはどうすればよいですか?指定したすべてのobjectMapperプロパティはclass Aに適用されます。ネストされたオブジェクトにいくつかのプロパティを適用するカスタムシリアライザを記述する必要がありますか?

+0

質問に記載されているJSONは無効です。あなたはそれらを[ここ](http://jsonlint.com/)で検証することができます。 –

答えて

1

カスタムシリアライザを使用できます。しかし、あなたが望むものを達成するための最も簡単な方法は、CインスタンスをラップするMapを使用している:

Map<String, Object> map = new HashMap<>(); 
map.put("rootC", c); 

あなたのクラスは次のように次のようになります。

@JsonRootName(value = "rootA") 
public class A { 
    public String name; 
    public B b; 
} 
public class B { 
    @JsonProperty("rep") 
    public Object representation; 
    public String bar; 
} 
public class C { 
    public BigInteger ste; 
    public String cr; 
} 

作成するためのコードJSONは次のようになります。

A a = new A(); 
a.name = "MyExample"; 

B b = new B(); 
b.bar = "something"; 

C c = new C(); 
c.cr = "C1"; 
c.ste = new BigInteger("7"); 

a.b = b; 

Map<String, Object> map = new HashMap<>(); 
map.put("rootC", c); 
b.representation = map; 

ObjectMapper mapper = new ObjectMapper(); 
mapper.enable(SerializationFeature.WRAP_ROOT_VALUE); 
mapper.enable(SerializationFeature.INDENT_OUTPUT); 

String json = mapper.writeValueAsString(a); 

生成されたJSONは次のようになります。

{ 
    "rootA" : { 
    "name" : "MyExample", 
    "b" : { 
     "rep" : { 
     "rootC" : { 
      "ste" : 7, 
      "cr" : "C1" 
     } 
     }, 
     "bar" : "something" 
    } 
    } 
} 
+0

これは動作しますが、入力を設定することは私の手にはありません。私はオブジェクトを塗りつぶして、それを直列化しなければならないので、私は 'Map'を設定するのではありません(クライアントはそれを行います)。だから私はカスタムシリアライザに行​​く必要がありますか? –

+0

カスタムシリアライザを使用する場合は、 '表現'部分をカスタマイズした方法でシリアル化し、残りのすべてのプロパティをルートクラスで設定した 'ObjectMapper'プロパティを使ってシリアル化します。どのように達成することができますか? –

+0

また、私のPOJOも注釈のために編集できません。 'ObjectMapper'を使わなければなりません –

関連する問題