杰克逊 - 忽略数据类型不匹配的属性

时间:2014-09-23 10:36:48

标签: java json jackson

我有很多JSON文件,我使用Jackson解析它。 所以我的JSON的一部分看起来像

"data": {
    "k": "ewt",
    "e": "dwpc",
    "d": 2,
    "ex": 0,
    "t": 3439
}

"data": {
    "k": "mmm1",
    "e": [{
        "x": 548,
        "y": 330,
        "t": 35733
    }, {
        "x": 541,
        "y": 342,
        "t": 36354
    }],
    "min": 0,
    "max": 0,
    "avg": 0
}

在这里,如果你注意到,在第一个"数据"块类型" e"是字符串,在第二个类型是数组。我关心的只是第二种类型的" e"那就是数组,所以我按照以下方式制作了我的POJO bean -

Class data.java

...
@JsonProperty("e")
private List<MouseDataArray> e = new ArrayList<MouseDataArray>();

some more properties .. and getters and setters .. 

并且

Class MouseDataArray.java

@JsonInclude(JsonInclude.Include.NON_NULL)


@JsonPropertyOrder({
    "x",
    "y",
    "t"
})
public class MouseDataArray {

    @JsonProperty("x")
    private Long x;
    @JsonProperty("y")
    private Long y;
    @JsonProperty("t")
    private Long t;

.. getters and setters
}

现在问题是我只关心财产&#34; e&#34;类型为Array,对String类型属性&#34; e&#34;不感兴趣。所以当它解析时,它会引发异常 无法从VALUE_STRING标记中反序列化java.util.ArrayList的实例 这是预期的,但我希望它只是跳过类型字符串的属性e而不是尝试将其映射到数组类型。

感谢。

1 个答案:

答案 0 :(得分:0)

传入的JSON似乎设计得很糟糕,因为它使用常规的String类型和'e'的Object - 大多数OO语言都没有这种组合的真正公共基类型。 因此,您对数据绑定的唯一选择是将e声明为java.lang.Object(在这种情况下,它将变为java.lang.Stringjava.util.Map)或{{1 (“JSON树”)。 然后,您需要在绑定后提取数据。

虽然您可以实现自定义反序列化器,但使用JsonNodeObject作为初始类型通常更简单,然后处理以后的转换。 例如,您可以使用以下代码将JsonNode转换为任何其他类型:

JsonNode

或者,如果你愿意的话,只要把东西拿出去

MyValue v = mapper.treeToValue(treeNode, MyValue.class)
相关问题