4

我有一个 JSON 结构,其中包含我的 POJO 中没有的包装级别。像这样:

JSON:

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

POJO:

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 进行序列化/反序列化的方法,以平稳地处理这个问题。

我知道杰克逊有一个@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 回答