如何使用 Jackson 解析不合格的 JSON 数组?
How can I parse an unqualified JSON array using Jackson?
所以,我正在访问第三方 API,它给了我这个 JSON 对象,但我花了很多时间试图找到一种优雅的方法来解析使用 Jackson 的资源子对象。
我假设我必须编写自定义解串器,但我想知道是否还有其他方法...
{
"somekey": "somevalue",
"resources": [
"list",
[
{
"@type": "com.yada.Yada",
"resource": {
"@type": "ServiceObjectReference",
"id": "emp1234",
"displayName": "Bob Smith"
},
"type": "TYPE_PERSON",
"resourceType": 200
},
{
"@type": "com.yada.Yada",
"resource": {
"@type": "ServiceObjectReference",
"id": "emp1235",
"displayName": "Sue Smith"
},
"type": "TYPE_PERSON",
"resourceType": 200
}
]
]
}
由于资源的值是一个具有不同对象类型的数组,您可能不想使用 POJO 进行映射。不确定自定义反序列化器的实现,但您可能想使用 ObjectMapper#readTree 方法,而不是根据其类型读取节点值
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(your_json_input);
JsnoNode resourcesNode = rootNode.path("resources");
for (JsonNode resourceNode : resourcesNode ) {
if (resourceNode.isObject()) {
// the node is an object, you could do POJO mapping now or keep using path() method to go deeper
} else {
// simply get the String value
String list = resourceNode.getTextValue();
}
}
看起来 json 的生产者使用了多态类型处理。
我们都同意这不是在 public api.
中使用的东西
但是,您可以尝试注释您的 类 以便 jackson 可以利用它。
注释 @JsonTypeInfo 将是您的起点
看起来像这样:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = MyYada.class, name="com.yada.Yada")
})
public class MyYada
我做了更多研究,看起来这是一个“2 元素 JSON 数组”。可以使用JsonTypeInfo.As(WRAPPER_ARRAY)
解析
所以,我正在访问第三方 API,它给了我这个 JSON 对象,但我花了很多时间试图找到一种优雅的方法来解析使用 Jackson 的资源子对象。
我假设我必须编写自定义解串器,但我想知道是否还有其他方法...
{
"somekey": "somevalue",
"resources": [
"list",
[
{
"@type": "com.yada.Yada",
"resource": {
"@type": "ServiceObjectReference",
"id": "emp1234",
"displayName": "Bob Smith"
},
"type": "TYPE_PERSON",
"resourceType": 200
},
{
"@type": "com.yada.Yada",
"resource": {
"@type": "ServiceObjectReference",
"id": "emp1235",
"displayName": "Sue Smith"
},
"type": "TYPE_PERSON",
"resourceType": 200
}
]
]
}
由于资源的值是一个具有不同对象类型的数组,您可能不想使用 POJO 进行映射。不确定自定义反序列化器的实现,但您可能想使用 ObjectMapper#readTree 方法,而不是根据其类型读取节点值
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(your_json_input);
JsnoNode resourcesNode = rootNode.path("resources");
for (JsonNode resourceNode : resourcesNode ) {
if (resourceNode.isObject()) {
// the node is an object, you could do POJO mapping now or keep using path() method to go deeper
} else {
// simply get the String value
String list = resourceNode.getTextValue();
}
}
看起来 json 的生产者使用了多态类型处理。 我们都同意这不是在 public api.
中使用的东西但是,您可以尝试注释您的 类 以便 jackson 可以利用它。
注释 @JsonTypeInfo 将是您的起点
看起来像这样:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = MyYada.class, name="com.yada.Yada")
})
public class MyYada
我做了更多研究,看起来这是一个“2 元素 JSON 数组”。可以使用JsonTypeInfo.As(WRAPPER_ARRAY)
解析