@JsonCreator的选择性使用

时间:2014-07-03 20:33:47

标签: android json jackson 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而不是实际的项目对象。 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输入,而且我也是而是避免手动解析所有内容。

1 个答案:

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