我有一个POJO,如
public class Category {
public Collection<Item> items;
public static class Item {
public String firstAttribute;
public int value;
}
}
我使用以下内容将json输入转换为POJO(类别):
JsonNode results = mapper.readTree(connection.getInputStream());
mapper.convertValue(results, Category.class));
这一切都很好,并且工作得像预期的那样。但是,输入JSON偶尔包含布尔值false而不是实际的项目对象。 JSON看起来像以下内容:
{
"id":1,
"items": [
{
"firstAttribute": "Test 1",
"value": 1
},
{
"firstAttribute": "Test 2",
"value": 2
},
{
"firstAttribute": "Test 3",
"value": 3
},
false,
false,
false,
{
"firstAttribute": "Test 4",
"value": 4
},
false,
{
"firstAttribute": "Test 5",
"value": 5
},
]
}
布尔值抛出解析器,使其抛出
的例外java.lang.IllegalArgumentException: Can not instantiate value of type [simple type, class com.example.test.Category$Item] from JSON boolean value; no single-boolean/Boolean-arg constructor/factory method
我尝试使用@JsonCreator
public class Category {
public int id;
public Collection<Item> items;
public static class Item {
public String firstAttribute;
public int value;
@JsonCreator public static Item Parse(JsonNode node) {
if (node.isBoolean()) {
return null;
}
else {
// use default Jackson parsing, as if the method 'Parse' wasn't there
}
}
}
}
这就是我遇到困难的地方。我还没弄清楚如何调用默认的Jackson Deserializer ,.当然,我可以自己简单地检索和设置值,但是,在我构建它的实际项目中,存在大量复杂的模型,以及各种不一致的json输入,而且我也是而是避免手动解析所有内容。
答案 0 :(得分:1)
不幸的是,这是有效的JSON,这应该可以解决问题:
public class Category {
private Integer id;
private Collection<Item> items = Lists.newArrayList();
@JsonCreator
public Category(@JsonProperty("id") Integer id,
@JsonProperty("items") ArrayNode nodes) {
this.id = id;
for (int i = 0; i < nodes.size(); i++) {
JsonNode node = nodes.get(i);
if (!node.isBoolean()) {
items.add(objectMapper.readValue(node, Item.class));
}
}
}
...
}