为了账号安全,请及时绑定邮箱和手机立即绑定

使用杰克逊反序列化包含 @JsonFormat(shape=JsonFormat.Shape.

使用杰克逊反序列化包含 @JsonFormat(shape=JsonFormat.Shape.

慕尼黑5688855 2022-07-27 09:29:54
我有一个自定义对象:public class Response{    @JsonProperty("values")    private List<Value> values;    @JsonFormat(shape=JsonFormat.Shape.ARRAY)    public static class Value {        public Value(long timestamp, float val)        {            this.timestamp = timestamp;            this.val = val;        }    }}但是,当它被解析时,我得到“无法从 START_ARRAY 令牌中反序列化 Response$Value 的实例”。json是:{"values":[[1552215648,18]]}知道我是否在这里遗漏了什么吗?或者我应该有一个自定义的反序列化器来执行这个?
查看完整描述

3 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

JsonFormat可以解决问题,但您还需要使用JsonCreator注释声明构造函数。看看下面的例子:


import com.fasterxml.jackson.annotation.JsonCreator;

import com.fasterxml.jackson.annotation.JsonFormat;

import com.fasterxml.jackson.annotation.JsonProperty;

import com.fasterxml.jackson.databind.ObjectMapper;


import java.io.File;

import java.util.List;


public class JsonApp {


    public static void main(String[] args) throws Exception {

        File jsonFile = new File("./resource/test.json").getAbsoluteFile();


        ObjectMapper mapper = new ObjectMapper();

        Response myPojo = mapper.readValue(jsonFile, Response.class);

        System.out.println(myPojo);

    }

}


class Response {


    private List<Value> values;


    public List<Value> getValues() {

        return values;

    }


    public void setValues(List<Value> values) {

        this.values = values;

    }


    @Override

    public String toString() {

        return "Response{" +

                "values=" + values +

                '}';

    }

}


@JsonFormat(shape = JsonFormat.Shape.ARRAY)

class Value {


    private long timestamp;

    private float val;


    @JsonCreator

    public Value(@JsonProperty("timestamp") long timestamp, @JsonProperty("val") float val) {

        this.timestamp = timestamp;

        this.val = val;

    }


    public long getTimestamp() {

        return timestamp;

    }


    public void setTimestamp(long timestamp) {

        this.timestamp = timestamp;

    }


    public float getVal() {

        return val;

    }


    public void setVal(float val) {

        this.val = val;

    }


    @Override

    public String toString() {

        return "Value{" +

                "timestamp=" + timestamp +

                ", val=" + val +

                '}';

    }

}

以下JSON有效载荷的代码:


{

  "values": [

    [

      1552215648,

      18

    ],

    [

      123,

      12.24

    ]

  ]

}

印刷:


Response{values=[Value{timestamp=1552215648, val=18.0}, Value{timestamp=123, val=12.24}]}



查看完整回答
反对 回复 2022-07-27
?
隔江千里

TA贡献1906条经验 获得超10个赞

你应该JsonFormat在变量values. 此外,由于您拥有 type 的变量List,因此您无需添加JsonFormat.


public class Response

    {

        @JsonProperty("values")

        @JsonFormat(shape=JsonFormat.Shape.ARRAY)

        private List<Value> values;


        public static class Value {

            private long timestamp;

            private float val;


            // Getters and Setters


            public Value(long timestamp, float val)

            {

                this.timestamp = timestamp;

                this.val = val;

            }

        }

    }

您的 JSON 输入格式将是:


{

  values: [

     {

       "timestamp": 589988,

       "val": 56.0,

      }

   ]

}

希望这可以帮助 !!我还没有测试过代码,所以如果有语法问题,请忽略。


查看完整回答
反对 回复 2022-07-27
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

我知道已经有一段时间了,但是由于我处理了同样的问题(反序列化 Prometheus REST API 响应的一部分?),并且提供的答案没有帮助,我想分享我的解决方案,它应该适用于每个类似的案例。


除此之外@JsonFormat(shape=JsonFormat.Shape.ARRAY),我还需要添加@JsonPropertyOrder注释以反映值在数组中出现的顺序。我还需要在构造函数上和每个构造函数的参数之前进行@JsonCreator注释。@JsonProperty以您的类为例,它应该如下所示:


public class Response

    {

        private List<Value> values;


        @JsonFormat(shape=JsonFormat.Shape.ARRAY)

        @JsonPropertyOrder({"timestamp", "val"})

        public static class Value {

            private long timestamp;

            private float val;


            @JsonCreator

            public Value(@JsonProperty("timestamp") long timestamp,

                         @JsonProperty("val") float val)

            {

                this.timestamp = timestamp;

                this.val = val;

            }


            // Getters and Setters


        }

    }

只有在我使用了这组特定的注释之后,我的响应才被反序列化而没有任何错误。


希望这会帮助别人!;)


编辑:一个注意事项:在我得到的 Prometheus 响应中,调用了一组不同类型的值,value而不是调用values,因此可能需要添加一个@JsonProperty("value")onprivate List<Value> values;字段或将其名称更改为,value如果任何人都是这种情况;)


@JsonProperty("value")

private List<Value> values;


查看完整回答
反对 回复 2022-07-27
  • 3 回答
  • 0 关注
  • 321 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信