如何在序列化期间将JSON属性名映射到我们自己的变量名?

时间:2014-07-12 07:40:37

标签: java json serialization gson

我正在尝试将我的以下JSON序列化为DataMetrics类 -

String json = "[{\"min\": 0,\"max\": 1209,\"avg\": 1.9203402,\"count\": 7344636,\"sumSq\": 71832774,  \"stddev\": 2.4683187, \"median\": 2,\"percentileMap\": {\"95\": 4},\"metricName\": \"TransactionDuration\",\"dimensions\": {\"env\": \"dev\",\"pool\": \"titan\",\"Name\": \"Client::Sync\", \"Type\": \"Client::Sync\"},\"value\": 14104200}]";

通常,对于像dimensions这样的嵌套对象,你会为它声明另一个POJO

class DataMetrics {

private String metricName;
private Map<String, Integer> percentileMap;
private String median;
private String stddev;
private String sumSq;
private String count;
private String avg;
private String max;
private String min;

  private Dimensions dimensions;

  private class Dimensions{
    private String env;
    private String pool;
    private String Name;
  }
}

以下是我的代码,它可以正常工作 -

public void test() {
    String json = "[{\"min\": 0,\"max\": 1209,\"avg\": 1.9203402,\"count\": 7344636,\"sumSq\": 71832774,  \"stddev\": 2.4683187, \"median\": 2,\"percentileMap\": {\"95\": 4},\"metricName\": \"TransactionDuration\",\"dimensions\": {\"env\": \"dev\",\"pool\": \"titan\",\"Name\": \"Client::Sync\", \"Type\": \"Client::Sync\"},\"value\": 14104200}]";

    final Gson gson = new Gson();
    final Type type = new TypeToken<List<DataMetrics>>() {}.getType();
    final List<DataMetrics> records = gson.fromJson(json, type);
}

这里的成员变量名称与JSON属性名称完全匹配。

  • stdDev =&gt; stddev
  • name =&gt; Name
  • percentile =&gt; percentileMap

现在有什么办法,我可以拥有自己的变量名称,并将JSON属性名称映射到这些名称,如果可能的话?我不想在我的Dimensions类中将Name保留为变量名。

1 个答案:

答案 0 :(得分:2)

使用SerializedName注释:

import com.google.gson.annotations.SerializedName;

class DataMetrics {

    [..]

    private Dimensions dimensions;

    private class Dimensions{
        private String env;
        private String pool;
        @SerializedName("Name")
        private String nameYouWant;
    }
}