【问题标题】:Error thrown when deserialising 2D Json Array using Jackson使用 Jackson 反序列化 2D Json 数组时抛出错误
【发布时间】:2022-11-28 23:35:01
【问题描述】:

我正在尝试从 JSON 中反序列化两件事。第一个的格式如下:

String json = "[{\"name\":\"Random\"," +
        "\"coordinates\":[[-3.1,55.4],[-3.1,55.9],[-3.7,55.3],[-3.8,55.7],[-3.0,55.8]]}]";

这是第二个:

String json2 = "[{\"name\":\"Random\"," + "\"longitude\":-3.1, \"latitude\":55}]

我的代码很简单,如下:

ObjectMapper mapper = new ObjectMapper();
var asArray = mapper.readValue(json, NoFlyZone[].class);
var asArray2 = mapper.readValue(json, LngLat.class);

NoFlyZone 类:

record NoFlyZone(LngLat[] coordinates) {

    @JsonIgnoreProperties("name")
    NoFlyZone (@JsonProperty("coordinates") double[][] coordinates) {
        this(doubleArrayToLngLatArray(coordinates));
    }
    private static LngLat[] doubleArrayToLngLatArray(double[][] coordinates) {
        var coordinateArray = new LngLat[coordinates.length];
        for (int i = 0; i < coordinates.length; i++) {
            coordinateArray[i] = new LngLat(coordinates[i][0], coordinates[i][1]);
        }
        System.out.println(coordinateArray);
        return coordinateArray;
    }

}

最后,LngLat 类:

record LngLat(double lng, double lat) {

    LngLat (@JsonProperty("longitude") double lng,
            @JsonProperty("latitude") double lat) {
        this.lng = lng;
        this.lat = lat;
    }
}

我已经尝试以上面显示的方式反序列化它们,但是在尝试反序列化第一个字符串时抛出 MismatchedInputException,并显示错误消息“无法从数组值(令牌JsonToken.START_ARRAY)中反序列化 uk.ac.ed.inf.LngLat 类型的值...” .我不确定为什么会这样,所以任何帮助将不胜感激。

我也试过添加注释

@JsonFormat(shape = JsonFormat.Shape.ARRAY)

并按照亚历山大的回答中的详细说明对其进行修复,但随后第二个字符串在尝试反序列化时会抛出错误。

【问题讨论】:

    标签: java arrays json multidimensional-array jackson


    【解决方案1】:

    由于您的记录 LngLat 表示为 JSON 数组(如 "[-3.1, 55.4]"),您需要自定义它的反序列化。

    为此,您可以使用 @JsonFormat 注释提供属性 shapeJsonFormat.Shape.ARRAY 的值。这将指示 Jackson 按照声明的顺序从数组中填充记录属性。

    @JsonFormat(shape = JsonFormat.Shape.ARRAY)
    record LngLat(double lng, double lat) {}
    

    并且封闭记录NoFlyZone将被简化为(解析数组的特殊方法LngLat是多余的):

    @JsonIgnoreProperties("name")
    record NoFlyZone(LngLat[] coordinates) {}
    

    使用示例:

    String json = "[{"name":"Random"," +
        ""coordinates":[[-3.1,55.4],[-3.1,55.9],[-3.7,55.3],[-3.8,55.7],[-3.0,55.8]]}]";
            
    ObjectMapper mapper = new ObjectMapper();
    
    System.out.println(mapper.readValue(json, new TypeReference<List<NoFlyZone>>() {}));
    

    输出: 笔记:toString() NoFlyZone 的方法已被覆盖以正确显示数组

    [NoFlyZone{coordinates=[LngLat[lng=-3.1, lat=55.4], LngLat[lng=-3.1, lat=55.9], LngLat[lng=-3.7, lat=55.3], LngLat[lng=-3.8, lat=55.7], LngLat[lng=-3.0, lat=55.8]]}]
    

    【讨论】:

    • 是的,这可行,但它会导致另一个问题,我之前应该提到过(抱歉占用您的时间)。我还必须从 JSON 中反序列化以下内容:String json = "[{"name":"Random"," + ""longitude":-3.1, "latitude":55}] 并从中构建一个 LngLat 对象。现在我收到一条错误消息,提示“无法从非数组表示形式(令牌:START_OBJECT)反序列化 POJO(LngLat 类型)。”谢谢!
    • @BobMarley 这更棘手,但我认为这是可行的。你真的需要update问题并包括这些细节,因为它改变了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 2015-02-28
    相关资源
    最近更新 更多