jackson 比较JSON并将数据为空的值设置到第一个对象中

ubof19bj  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(115)

同事们!我有两个目标:

1、

{
  "name": "test_name",
  "contact": [
     {
      "street": "st.1",
      "phoneNumber": "test_n"
     }
   ]
}

{
  "name": "test_name",
  "contact": [
     {
      "street": "st.1",
      "phoneNumber": "test_n"
     }
   ],
  "additionalInfo": null
}

二、

{
  "name": "test_name_2",
  "additionalInfo": {
    "lastName": "ln",
    "age": 24
  }
}

我使用JsonObject(Jacksonfrom java),我想将第一个对象的这些字段设置为空值,而第二个对象没有。例如,我想获取第一个对象,如下所示:

{
  "name": "test_name",
  "contact": [
     {
      "street": "st.1",
      "phoneNumber": "test_n"
     }
   ],
   "additionalInfo": {
    "lastName": "ln",
    "age": 24
  }
}

因为从第一个对象开始,这个字段是空的。有没有可能做点什么?谢谢!

6rqinv9w

6rqinv9w1#

据我所知,没有现成的解决方案。
根据here给出的答案,我修改了merge()函数以满足您的需要。
以下是实现:

public static JsonNode merge(JsonNode mainNode, JsonNode updateNode) {

        Iterator<String> fieldNames = updateNode.fieldNames();
        while (fieldNames.hasNext()) {

            String fieldName = fieldNames.next();
            JsonNode jsonNode = mainNode.get(fieldName);
            // if field exists and is an embedded object
            if (jsonNode != null && jsonNode.isObject()) {
                merge(jsonNode, updateNode.get(fieldName));
            } else {
                if (mainNode instanceof ObjectNode) {
                    JsonNode updateNodeValue = updateNode.get(fieldName);
                    JsonNode mainNodeValue = mainNode.get(fieldName);
                    if ((Objects.isNull(mainNodeValue) || mainNodeValue.isNull()) && (Objects.nonNull(updateNodeValue) && !updateNodeValue.isNull())) {
                        ((ObjectNode) mainNode).put(fieldName, updateNodeValue);
                    }
                }
            }

        }

        return mainNode;
    }

这个函数基本上只接受作为第二个参数传递的对象中存在的那些属性,并将这些属性添加到作为第一个参数传递的对象中。
据我所知,这就是你需要的。
如果运行下面的代码:

public static void main(String[] args) throws JsonProcessingException {

        ObjectMapper mapper = new ObjectMapper();

        final String jsonStringOne = "{\n" +
                "  \"name\": \"test_name\",\n" +
                "  \"contact\": [\n" +
                "     {\n" +
                "      \"street\": \"st.1\",\n" +
                "      \"phoneNumber\": \"test_n\"\n" +
                "     }\n" +
                "   ]\n" +
                "}";

        final String jsonStringTwo = "{\n" +
                "  \"name\": \"test_name_2\",\n" +
                "  \"additionalInfo\": {\n" +
                "    \"lastName\": \"ln\",\n" +
                "    \"age\": 24\n" +
                "  }\n" +
                "}";

        final JsonNode to= mapper.readTree(jsonStringOne);

        final JsonNode from = mapper.readTree(jsonStringTwo);

        final JsonNode jsonNode = merge(to, from);

        System.out.println(jsonNode);
    }

您应该会看到如下输出:

{
"name":"test_name",
"contact": [{"street":"st.1","phoneNumber":"test_n"}],
"additionalInfo":{"lastName":"ln","age":24}
}

相关问题