当使用Apache Jersey与Jackson进行JSON序列化(在服务器和客户端上)时,我在反序列化通用List时遇到了问题.
我生成的JSON如下,"data"中的所有3个类都实现了"CheckStatusDetail":
{
"errorCode" : 0,
"errorMessage" : null,
"type" : "array",
"data" : [ {
"@class" : "com.rrr.base.status.module.dto.DiscoveryAgentCheckStatusDetail",
"serverInfo" : {
"@class" : "com.rrr.base.util.discovery.config.xml.XMLServerInfo",
"name" : "java",
"location" : "THEO",
"description" : "sddgs",
"group" : "java",
"aliases" : [ "mercury" ]
}
}, {
"@class" : "com.rrr.base.status.module.dto.MongoDBCheckStatusDetail",
"addresses" : [ "localhost:27017" ],
"version" : "2.5",
"connected" : true
}, {
"@class" : "com.rrr.base.status.module.dto.NetworkCheckStatusDetail",
"splitBrain" : false
} ],
"count" : 3,
"status" : 0
}
Run Code Online (Sandbox Code Playgroud)
生成此JSON的对象看起来像这样,我在客户端使用相同的类:
public class …Run Code Online (Sandbox Code Playgroud) 我有一个 Java 对象结果:
public class MetaData {
private List<AttributeValue<String,Object>> properties
private String name
...
... getters/setters ...
}
Run Code Online (Sandbox Code Playgroud)
该的AttributeValue类是通用的键值类。可能嵌套了不同的 AttributeValue。(value) Object将是另一个 AttributeValue 等等。
由于遗留原因,无法更改此对象的结构。
我有我的 JSON,我尝试将其映射到此对象。对于常规属性,一切顺利。此外,列表的第一级填充有 AttributeValues。
问题是Object。Jackson 不知道如何解释这种嵌套行为,只是将其设为 LinkedHashMap。
我正在寻找一种实现自定义行为的方法来告诉杰克逊这必须是一个 AttributeValue 对象而不是 LinkedHashMap。
这就是我目前转换 JSON 的方式:
ObjectMapper om = new ObjectMapper();
MetaData metaData = om.readValue(jsonString, new TypeReference<MetaData>(){});
Run Code Online (Sandbox Code Playgroud)
这是示例 JSON。(这是通过将现有 MetaData 对象序列化为 JSON 获得的,我可以完全控制此语法)。
{
"properties":[
{
"attribute":"creators",
"value":[
{
"attribute":"creator",
"value":"user1"
},{
"attribute":"creator",
"value":"user2"
}
]
},{
"attribute":"type",
"value": "question"
}
], …Run Code Online (Sandbox Code Playgroud)