繁体   English   中英

Jackson-忽略数据类型不匹配的属性

[英]Jackson - Ignore properties whose data type does not match

我有许多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
}

在这里,如果iyou注意到,在第一个“数据”块中,类型“ e”是字符串,在第二个中,类型是Array。 我只关心数组的第二种类型“ 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
}

现在的问题是,我只关心数组类型的属性“ e”,而不关心字符串类型的属性“ e”。 因此,在解析时,它会引发异常。 无法从VALUE_STRING令牌中反序列化java.util.ArrayList的实例 ,但是我希望它仅跳过字符串类型的属性e而不是尝试将其映射为Array类型。

谢谢。

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

尽管可以实现自定义反序列化器,但通常更简单的方法是只使用ObjectJsonNode作为初始类型,然后再处理以后的转换。 例如,您可以使用以下方法将JsonNode转换为任何其他类型:

MyValue v = mapper.treeToValue(treeNode, MyValue.class)

或者,如果您愿意,只要

JsonNode first = treeNode.get(0);
MyValue v = new MyValue(first.get("x").asInt(), ...);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM