使用Jackson为JSON添加属性

cYn*_*cYn 9 java json jackson

所以我jsonStr就是这个

[
    {
        "data": [
            {
                "itemLabel": "Social Media",
                "itemValue": 90
            },
            {
                "itemLabel": "Blogs",
                "itemValue": 30
            },
            {
                "itemLabel": "Text Messaging",
                "itemValue": 60
            },
            {
                "itemLabel": "Email",
                "itemValue": 90
            }
        ]
    }
]
Run Code Online (Sandbox Code Playgroud)

我想在这个data数组之后添加一个属性

[
    {
        "data": [
            {
                "itemLabel": "Social Media",
                "itemValue": 90
            },
            {
                "itemLabel": "Blogs",
                "itemValue": 30
            },
            {
                "itemLabel": "Text Messaging",
                "itemValue": 60
            },
            {
                "itemLabel": "Email",
                "itemValue": 90
            }
        ],
        "label": "2007"
    }
]
Run Code Online (Sandbox Code Playgroud)

在这里阅读它说要做类似的事情

ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(jsonStr);
((ObjectNode) jsonNode).put("label", "2007");

String json = mapper.writeValueAsString(jsonNode);

return json;
Run Code Online (Sandbox Code Playgroud)

问题是我一直收到错误

java.lang.ClassCastException: com.fasterxml.jackson.databind.node.ArrayNode cannot be cast to com.fasterxml.jackson.databind.node.ObjectNode
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我目前正在使用Jackson-core 2.2.2

Hen*_*nry 10

顶级节点表示数组,而不是对象.在添加属性之前,您需要更深入一级.

你可以使用这样的东西:

JsonNode elem0 = ((ArrayNode) jsonNode).get(0);
((ObjectNode) elem0).put("label", "2007");
Run Code Online (Sandbox Code Playgroud)

当然,如果结构看起来不像您期望的那样,您可能需要添加一些错误处理.