我在我的Postgres DB中输入json,并将其作为POJO
获取。然后我尝试将我的POJO
写入String
。POJO
被正确填充,但是当Jackson将其写入String
时,我得到了{"traversableAgain" : true, "empty" : false}
,因为嵌套的JSON
在POJO
中的类型是Object
。
我的POJO
:
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MyClass {
private String property1;
private Double property2;
private Boolean property3;
private Object problematicProperty;
}
我从DB中检索的JSON:
{
"property1" : "randomString",
"property2" : 0.3,
"property3" : false,
"problematicProperty" : {
"yearFromDate": [
"dob",
"yyyyMMdd"
]
}
}
我的代码:
MyClass myPOJO = myRepository.getOne(pojoID);
ObjectMapper obj = getObjectMapper();
obj.enable(SerializationFeature.INDENT_OUTPUT);
obj.enable(SerializationFeature.WRAP_ROOT_VALUE);
String stringLayout = obj
.writerWithDefaultPrettyPrinter()
.writeValueAsString(myPOJO);
当我打印stringLayout时,我得到:
{
"property1" : "randomString",
"property2" : 0.3,
"property3" : false,
"problematicProperty" : {"traversableAgain" : true, "empty" : false}
}
而不是
{
"property1" : "randomString",
"property2" : 0.3,
"property3" : false,
"problematicProperty" : {
"yearFromDate": [
"dob",
"yyyyMMdd"
]
}
}
我用的是java。lang.Object类型因为problematicProperty是“动态的”,有时会像上面那样嵌套json,有时候会是string e。例如:
"problematicProperty" : "randomText"
测试时,如果我使用com.fasterxml.jackson.databind.node.ObjectNode
类型而不是Object
,则字符串被正确写入。但是我不能在Hibernate中使用ObjectNode
。
为什么会发生这种情况,是否有方法配置objectMapper
将java.lang.Object
(实际上是嵌套的JSON
)正确写入String
?
2条答案
按热度按时间j0pj023g1#
受this答案的启发,我添加了此链接
现在它工作正常,代码看起来像这样:
kqhtkvqz2#
举一个完整的例子会有所帮助。如果我从你的代码中创建一个虚拟的例子-见下文,那么它就能按预期工作。
{"traversableAgain" : true, "empty" : false}
JSON很可能来自Scala类型,可能是Scala Map。如果不知道这些数据来自哪里,很难说如何修复它。一个可能的解决方案是将problematicProperty字段类型更改为(Java)Map,并在构造对象时转换Scala Map。