4

POJO にないラッピング レベルを組み込んだ JSON 構造があります。そのようです:

JSON:

{
    "category1": {
        "cat1Prop1": "c1p1",
        "cat1Prop2": "c1p2",
        "cat1Prop3": "c1p3"
    },
    "category2": {
        "cat2Prop1": "c2p1",
        "cat2Prop2": "c2p2"
    },
    "category3": {
        "cat3Prop1": "c3p1",
        "cat3Prop2": "c3p2",
        "cat3Prop3": "c3p3"
    },
    "category4": {
        "cat4Prop1": "c4p1"
    }
}

ポジョ:

public class MyPojo {

    private String cat1Prop1;
    private String cat1Prop2;
    private String cat1Prop3;

    private String cat2Prop1;
    private String cat2Prop2;

    private String cat3Prop1;
    private String cat3Prop2;
    private String cat3Prop3;

    private String cat4Prop1;


    // Getters / setters, etc...
}

ご覧のとおり、JSON には「カテゴリ」レベルがあります (さまざまな理由から、Pojo には入れたくないものです)。

これをスムーズに処理するために、シリアル化/逆シリアル化に Jackson を使用する方法を探しています。

Jackson には、反対の処理を行う@JsonUnwrappedアノテーションがあることは承知しています。また、私のケースを解決すると思われる「@JsonWrapped」アノテーションの機能要求があることも認識しています。

私はかなり探し回っていたので、これに関する意見や助けに感謝します。また、他のライブラリ (gson、flexjson など) を使用してこれを実現する方法についての提案も興味深いものです。

4

1 に答える 1

1

このアルゴリズムを試すことができます:

  1. JSON を として読み取りますMap
  2. マップを平坦化
  3. ObjectMapper を使用して Map を POJO に変換します。

実装は次のようになります。

ObjectMapper mapper = new ObjectMapper();

Map<String, Map<String, String>> map = mapper.readValue(new File("X:/test.json"), Map.class);
Map<String, String> result = new HashMap<String, String>();
for (Entry<String, Map<String, String>> entry : map.entrySet()) {
    result.putAll(entry.getValue());
}

System.out.println(mapper.convertValue(result, MyPojo.class));
于 2013-07-16T08:48:24.357 に答える