我正在编写一个 Java 库,用于与 Graphite 中的指标进行交互。 典型的 JSON 响应如下所示(取自官方文档):
[{
"target": "entries",
"datapoints": [
[1.0, 1311836008],
[2.0, 1311836009],
[3.0, 1311836010],
[5.0, 1311836011],
[6.0, 1311836012]
]
}]
其中“datapoints”数组的第一个元素是值,第二个元素是时间戳。我建模了一个 GraphiteDataset 类,如下所示
class GraphiteDataset {
private String target;
private List<GraphiteDatapoint> datapoints;
....
}
和 GraphiteDatapoint 类
class GraphiteDatapoint {
private Long timestamp;
private Double value;
...
}
现在我需要将响应(见上文)解析到 GraphiteDataset 中
使用 Gson 的类。不幸的是,“datapoints”的元素不是命名对象(例如 {timestamp: 1234, value: 1.0}
而是一个二维数组,因此我无法直接将其反序列化为某个类。目前我的解决方案是拥有中级类(class)
class GraphiteIntermediateDataset {
private String target;
private List<String> datapoints;
...
}
其中的数据点为字符串,然后我将它们解析为适当的 GraphiteDatapoint 实例。我认为我无法解决自定义解串器。您有什么建议或技巧可以让这变得更方便吗?
最佳答案
JSON [1.2, 123456]
是一个 Double
和 Long
的数组,但它们都是 Number
,所以试试这个:
class GraphiteDataset {
private String target;
private List<List<Number>> datapoints;
....
}
然后在解析后将数据点
转换为您的类型,例如:
List<GraphiteDatapoint> points = datapoints.stream().
.map(nums -> new GraphiteDatapoint(nums.get(0).doubleValue(), nums.get(1).intValue()))
.collect(Collectors.toList());
假设构造函数如下:
class GraphiteDatapoint {
private Long timestamp;
private Double value;
public GraphiteDatapoint(Double value, Long timestamp) {
this.value = value;
this.timestamp = timestamp;
}
...
}
关于java - 使用 Gson 解析 Graphite JSON 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41988734/