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}]}
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,
}
]
}
希望这可以帮助 !!我还没有测试过代码,所以如果有语法问题,请忽略。
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;
添加回答
举报