杰克逊:如何将平面 json 转换为嵌套 json

约翰内斯翼

我怎样才能转换一个json字符串

{
    "a.b": 1,
    "a.c.d": 2
}

成json字符串

{
    "a": {
        "b": 1,
        "c": {
            "d": 2
        }
    }
}

通过使用ObjectMapper

最简单的选择是创建自定义解串器或自定义@JsonAnySetter@JsonAnyGetter这是示例:

public static final String json = "{\"a.b\": 1,\"a.c.d\": 2}";
public static void main(String[] args) throws IOException {
    ObjectMapper mapper = new ObjectMapper();
    HelperBean bean = mapper.readValue(json, HelperBean.class);
    System.out.println(mapper.writeValueAsString(bean)); 
    // result: {"a":{"b":1,"c":{"d":2}}}
}
public static class HelperBean{
    @JsonIgnore
    private Map<String, Object> data = new TreeMap<>();

    @JsonAnySetter
    public void setDays(String key, Object value){
        String[] parts = key.split("\\.");
        Map<String, Object> currMap  = data;
        for (int i = 0; i< parts.length; i++){
            String part = parts[i];
            Object subMap  = currMap.get(part);
            if (i == parts.length - 1) // last node
                currMap.put(part, value);
            else if(subMap == null){ // new node
                subMap = new TreeMap<>();
                currMap.put(part, subMap);
                currMap = (Map<String, Object>) subMap;
            }else if (subMap instanceof Map){ // existing node
                currMap.put(part, subMap);
                currMap = (Map<String, Object>) subMap;
            } else { // node conflict
                // handle exception when a.b = 1 and a.b.c = 1
            }
        }
    }
    @JsonAnyGetter
    public Map<String, Object> getData() {
        return data;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

杰克逊:使用点表示法将JSON属性转换为嵌套对象

杰克逊将动态json转换为地图

使用杰克逊将json转换为java对象

使用杰克逊将列表转换为json

杰克逊将JSON转换为对象

杰克逊,如何使用原始类型将json转换为Java类?

jq:如何将平面json转换为嵌套的

将嵌套 JSON 转换为平面 JSON

在进行杰克逊反序列化时,如何将JSON字段名称转换为Java兼容的属性名称?

将杰克逊的嵌套json映射到java字段

如何使用杰克逊java将csv读取到嵌套的json

如何使用杰克逊创建嵌套的json对象

改进的方式嵌套的JSON对象的布尔值转换为与杰克逊地图

杰克逊将json转换为String和列表的映射

杰克逊无法将json转换为地图列表

使用杰克逊将Json对象转换为Java对象

杰克逊:将JSON转换为对象:对象的ArrayList与对象的arraylist与对象的arraylist

杰克逊自动将json日期转换为比其时间早8小时的日期

用杰克逊转换的protobuf以JSON?

杰克逊json日期格式转换

将嵌套的JSON转换为简单的JSON

如何忽略地图相关的括号,而使用杰克逊JSON转换为Java对象

如何JSON字段名称转换为Java bean类属性与杰克逊

如何使用杰克逊在Java中将JSON转换为POJO

如何将JSON对象的嵌套部分转换为点链式平面JSON?

如何在Java中使用杰克逊将输入字符串转换为JSON字符串或JSON对象

将嵌套的 JSON 数组转换为平面 JSON 数组

使用杰克逊将Java对象转换为json字符串时重复的json属性

按照通用类,使用具有动态JSON密钥的杰克逊将通用POJO转换为JSON