Java 在没有POJO包装器的情况下将对象放入JsonNode

Java 在没有POJO包装器的情况下将对象放入JsonNode,java,json,jackson,objectmapper,jackson-databind,Java,Json,Jackson,Objectmapper,Jackson Databind,我有一个深度嵌套的JsonNode,在其中一个嵌套的节点上,我想将值设置为一个对象(这里是LocalDate对象)。我知道要在json节点中放入一些值,我们需要将其强制转换为ObjectNode,然后我们有set()和put()方法 下面是示例代码,用于演示问题陈述和我的方法 import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; impo

我有一个深度嵌套的JsonNode,在其中一个嵌套的节点上,我想将值设置为一个对象(这里是LocalDate对象)。我知道要在json节点中放入一些值,我们需要将其强制转换为ObjectNode,然后我们有set()和put()方法

下面是示例代码,用于演示问题陈述和我的方法

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.JsonNodeType;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

import java.time.LocalDate;
import java.time.ZonedDateTime;

public class LocalDateToJsonNode {
    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper().registerModule(new JavaTimeModule());
        LocalDate localDate = ZonedDateTime.now().toLocalDate();

        System.out.println(localDate);

        String jsonString = "{\"dateToSet\":\"\"}";
        JsonNode jsonNode = objectMapper.readValue(jsonString, JsonNode.class);

        ObjectNode objectNode = (ObjectNode) jsonNode;
        objectNode.putPOJO("dateToSet", localDate);

        ObjectNode objectNode2 = objectNode.deepCopy();
        objectNode2.set("dateToSet", objectMapper.convertValue(localDate, JsonNode.class));

        JsonNodeType typ1 = objectNode.get("dateToSet").getNodeType();

        JsonNodeType typ2 = objectNode2.get("dateToSet").getNodeType();

        System.out.println(typ1);
        System.out.println(typ2);
    }
}
上述代码的输出为:

2020-10-13
POJO
ARRAY

这意味着我用来放置对象的方法是将对象包装成POJONode

我希望对象按原样存储,因为稍后我的用例涉及将JsonNode树转换为深度映射。在地图上,最后的地图应该是这样的:

{
  "level1": {
    "levelKey1": {
      "key": "value",
      "key2": "value",
    },
    "levelKey2": {
      "key3": "value2",
      "dateToSet": "2020-10-13" // This is not string, but a LocalDate object
    }
  }
}

如果手动构建整个对象节点,还可以将已格式化的日期放在其中。您可以实现您的
RawObject
版本,但这可能是一种过分的做法。