#android #json #jackson #pojo
#Android #json #джексон #pojo
Вопрос:
У меня есть 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 вместо фактического объекта item. 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 по умолчанию, . Конечно, я мог бы просто извлечь и установить значения самостоятельно, однако в реальном проекте, для которого я это создаю, существует большое количество сложных моделей и различных, противоречивых входных данных json, и я бы предпочел избежать разбора всего вручную.
Ответ №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));
}
}
}
...
}