java - 使用 Gson 解析 Graphite JSON 响应

标签 java gson graphite

我正在编写一个 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] 是一个 DoubleLong 的数组,但它们都是 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/

相关文章:

java - 将带有大量不必要信息的 JSON 映射到 Java 对象时的正确方法

java - 在 android AsyncTask 中获取数据并更新 UI View

json - 如何处理 Kotlin 中的空参数?

ruby - Graphite 烯 : ruby bundler install fails

amazon-ec2 - 如何配置 StatsD 和 Graphite 在不同的服务器上运行

java - 将多个 BigDecimals 求和到一个 Map<String, BigDecimal>

java - 如何读取Web项目中的内部文件

java - 如何只反序列化 JSON 中的某些字段?

java - TypeAdapterFactory 的 Lambda 表达式

JMeter - Graphite 后端监听器 rootmetricsPrefix 获取先前生成的值