JSON与包裹结构之间的转换和具有扁平结构的pojo

时间:2013-07-16 07:46:39

标签: java json serialization jackson deserialization

我有一个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等)完成此操作的建议也很有趣。

1 个答案:

答案 0 :(得分:1)

您可以尝试使用此算法:

  1. 将JSON读为Map
  2. 拼合地图
  3. 使用ObjectMapper将Map转换为POJO。
  4. 实施可能如下所示:

    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));