17

こんな豆があります。

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

class Data {
    private fieldOne;
    private fieldTwo;
}

このようにJsonとしてシリアライズしたい

{
    "key1": {
        "fieldOne": "some value",
        "fieldTwo": "some value"
    },
    "key2": {
        "fieldOne": "some other value",
        "fieldTwo": "some other value"
    },
    "fooFieldOne":"valueone", 
    "fooFieldTwo":"valuetwo" 
}

しかし、私は次のような結果を得ています

{
    "dataMap": {
        "key1": {
            "fieldOne": "some value",
            "fieldTwo": "some value"
        },
        "key2": {
            "fieldOne": "some other value",
            "fieldTwo": "some other value"
        }
    },
    "fooFieldOne":"valueone", 
    "fooFieldTwo":"valuetwo" 
}

上記のjsonでdataMapレイヤーを無視するにはどうすればよいですか? これにはJava jacksonライブラリを使用しています。

私が試したコードは

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

4 に答える 4

11

インスタンス全体ではなく、 dataMapのゲッターを作成し、dataMapをシリアライズすることができます。Foo

mapper.writeValueAsString(myFOOObject.getDataMap());

別の方法は、@JsonUnwrapped注釈を使用することです。この注釈は、Jackson 1.9 以降で使用できます。

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

この注釈を使用することの欠点は、他の質問への回答に記載されているようにマップを使用できないことです

于 2013-08-04T09:46:49.247 に答える
2

あなたは得ています

{ "dataMap": ... } 

その中に呼び出されるフィールドFooがあるためです。ここでは、複数のマップがある場合に競合が発生するため、フィールドの名前を無視することはできません。dataMapFoo

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

今は fieldName がありません: JSON では、JSON は次のような JSON を取得したときに逆シリアル化する方法を知りません

{
    //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"
    }
}

fieldName を使用すると、逆シリアル化中に非常に明確になります

{
    "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でdataMapレイヤーを無視するには?

マップをシリアル化するだけです

ObjectMapper mapper = new ObjectMapper();
mapper.writeValueAsString(myFOOObject.getDataMap());
于 2013-08-04T09:44:54.957 に答える
0

マップには と の 2 つのオブジェクトがStringありDataます。JSONはJavaオブジェクトをJSONキーと値のペアに変換しますが、キーと値のペアを含むマップがすでにあり、そのマップをJSONドキュメントに変換すると、マップキーもJSONキーと値のペアに変換され、マップ値にもオブジェクトがありますキーと値のペアに変換します。

于 2013-08-04T09:44:55.850 に答える