2013-08-04 5 views
13

私は jacksonを使用してJavaでjavaマップを展開してシリアル化する方法は?

このような
{ 
    "key1": { 
     "fieldOne": "some value", 
     "fieldTwo": "some value" 
    }, 
    "key2": { 
     "fieldOne": "some other value", 
     "fieldTwo": "some other value" 
    }, 
    "fooFieldOne":"valueone", 
    "fooFieldTwo":"valuetwo" 
} 

としてJSONとしてシリアライズしたいが、私は

にDATAMAP層を無視する方法
{ 
    "dataMap": { 
     "key1": { 
      "fieldOne": "some value", 
      "fieldTwo": "some value" 
     }, 
     "key2": { 
      "fieldOne": "some other value", 
      "fieldTwo": "some other value" 
     } 
    }, 
    "fooFieldOne":"valueone", 
    "fooFieldTwo":"valuetwo" 
} 

のような結果を取得しています。この

class Foo { 
    private Map<String, Data> dataMap; 
    private String fooFieldOne; 
    private String fooFieldTwo; 
} 

class Data { 
    private fieldOne; 
    private fieldTwo; 
} 

のような豆を持っています上記のjson?私はこれにjava jacksonライブラリを使用しています。私が試した

コードFooフィールドが、その中にdataMapと呼ばれていますので、あなたは

{ "dataMap": ... } 

を取得している

ObjectMapper mapper = new ObjectMapper(); 
mapper.writeValueAsString(myFOOObject) 

答えて

10

あなたはDATAMAPのgetterを作成し、全体ではなくFooインスタンスのDATAMAPをシリアル化できます。

mapper.writeValueAsString(myFOOObject.getDataMap()); 

別の方法では、アノテーションを使用しています。この注釈はJackson 1.9以降で利用できます。マップのゲッターと@JsonAnyGetterアノテーションを使用して -

http://jackson.codehaus.org/1.9.9/javadoc/org/codehaus/jackson/annotate/JsonUnwrapped.html

この注釈を使用しての欠点は、私が答えたanswer to your other question

+0

こんにちはバート、ありがとうございました。しかし私はまた、私の豆に他のフィールドを持っています。 Fooは他のフィールドfooFieldOne、fooFieldTwoをすでに持っているマップと共に持っていると考えてください。 {"key1":{"fieldOne": "some value"、 "fieldTwo": "some value"}、 "key2":{"fieldOne": "some other value"、 " 「fieldTwo」:「some other value」}、「fooFieldOne」:「valueone」、「fooFieldTwo」:「valuetwo」}。どのように私はこれを処理できますか? – suren

+0

@JsonUnwrappedアノテーションを含めるように私の答えを更新しました。 – Bart

2

です。 JSONには、JSONはどのように認識していない:それはFooは、フィールド名を持つことなく、

class Foo { 
private Map<String, Data> dataMap1; 
private Map<String, Data> dataMap2; 
} 

のようなものを複数のマップを持っていた場合を競合作成されますので、ここではフィールドの名前はを無視することはできませんそれが今

012をデシリアライズしながら、フィールド名がそれ 非常に明確作る持つ

{ 
    //belongs to dataMap1 
    "key1": { 
     "fieldOne": "some value", 
     "fieldTwo": "some value" 
    }, 
    "key2": { 
     "fieldOne": "some value", 
     "fieldTwo": "some value" 
    }, 
    //belongs to dataMap2 
    "key3": { 
     "fieldOne": "some value", 
     "fieldTwo": "some value" 
    }, 
    "key4": { 
     "fieldOne": "some other value", 
     "fieldTwo": "some other value" 
    } 
} 

のようないくつかのJSONを取得したときにデシリアライズ

{ 
    "dataMap1" : { 
    "key1": { 
     "fieldOne": "some value", 
     "fieldTwo": "some value" 
    }, 
    "key2": { 
     "fieldOne": "some value", 
     "fieldTwo": "some value" 
    } 
    }, 
    "dataMap2" : { 
    "key3": { 
     "fieldOne": "some value", 
     "fieldTwo": "some value" 
    }, 
    "key4": { 
     "fieldOne": "some other value", 
     "fieldTwo": "some other value" 
    } 
    } 
} 

はJSONでデータマップ層を無視する方法

ことを言いましたか?

あなたはちょうど2つのオブジェクトStringDataがあるマップでマップ

ObjectMapper mapper = new ObjectMapper(); 
mapper.writeValueAsString(myFOOObject.getDataMap()); 
+0

詳細な回答をいただきありがとうございます。私の場合は何が起こっているのか分かります。しかし、私は自分の豆の中に他の畑がある。 Fooは他のフィールドfooFieldOne、fooFieldTwoを持っていると考えています。 { "fieldOne": "いくつかの値"、 "fieldTwo": "いくつかの値" }、 "KEY2":{ "fieldOne": "私は{ "キー1" のような単一のオブジェクトとして、すべてをシリアライズしたいです他の値 " " fieldTwo ":"その他の値 " "、 "fooFieldOne": "valueone"、 "fooFieldTwo": "valuetwo" }。どのように私はこれを処理できますか? – suren

+0

マップフィールドには常に名前がついています(名前のないフィールドはありません)。それはJSONで確実に捕捉されます。 – sanbhat

+0

@sanbhat '@JsonUnwrapped'を使用すると可能です。 – Bart

0

をシリアル化することができます。 JSONは、JSONキー値のペアにJavaオブジェクトを変換するが、すでにキー値のペアを含むマップを持っている場合は、そのマップをJSONドキュメントに変換し、マップキーはJSONキー値ペアに変換され、Map値もオブジェクトを持つキー値のペアに変換されます。

0

に述べたようにマップを使用することができないことです。逆シリアル化中の競合を避けるには、このマップのsetterで@JsonAnySetter注釈を使用する必要があります。

関連する問題