Выборочное использование @JsonCreator

#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));
            }
        }
    }
    ...
}