Java 在没有POJO包装器的情况下将对象放入JsonNode
我有一个深度嵌套的JsonNode,在其中一个嵌套的节点上,我想将值设置为一个对象(这里是LocalDate对象)。我知道要在json节点中放入一些值,我们需要将其强制转换为ObjectNode,然后我们有set()和put()方法 下面是示例代码,用于演示问题陈述和我的方法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
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
版本,但这可能是一种过分的做法。