无法从Flurry API反序列化json响应

时间:2015-06-17 00:38:05

标签: java json spring flurry

我试图在我的Spring应用程序中使用Flurry的REST API读取一些统计信息。但是我的对象将返回所有字段的空值。我认为这是因为JSON响应将@符号添加到响应中的非数组字段。我得到的回答如下:

{
  "@endDate": "2015-06-16",
  "@metric": "PageViews",
  "@startDate": "2015-06-16",
  "@generatedDate": "6/16/15 5:06 PM",
  "@version": "1.0",
  "day": [
          {
            "@date": "2015-06-16",
            "@value": "0"
          }
         ]
}

我用来发出请求的代码如下:

RestTemplate restTemplate = new RestTemplate();
FlurryAppMetric appMetric = restTemplate.getForObject(url, FlurryAppMetric.class);
return appMetric;

FlurryAppMetric如下所示(省略了getters& setters):

public class FlurryAppMetric {
    private String metric;
    private String startDate;
    private String endDate;
    private String generatedDate;
    private String version;
    private ArrayList<FlurryMetric> day;
}

public class FlurryMetric {
    private String date;
    private String value;
}

一种可能的解决方案是将其全部解析为地图,但我想尽可能利用它们公开的映射器。

如果有某种方法只是发出一个GET请求并以字符串形式接收主体,我就可以清理响应并尝试将其传递给映射器。

2 个答案:

答案 0 :(得分:1)

您应该能够使用@SerializedName注释使用GSON解析它,如下所示:

public class FlurryAppMetric {
    @SerializedName("@metric");
    private String metric;

    @SerializedName("@startDate");
    private String startDate;

    @SerializedName("@endDate");
    private String endDate;

    @SerializedName("@generatedDate");
    private String generatedDate;

    @SerializedName("@versionDate");
    private String version;

    @SerializedName("day");
    private ArrayList<FlurryMetric> day;
}

public class FlurryMetric {
    @SerializedName("@date");
    private String date;

    @SerializedName("@value");
    private String value;
}

然后像这样使用Gson:

    Gson gson = new Gson();
    gson.fromJson(<string json source>, FlurryApiMetric.class);

答案 1 :(得分:1)

reidzeibel让我走上正轨。我正在使用Jackson FasterXML解析器,因为这是org.springframework.web.client.RestTemplate在幕后使用的。与GSON库的 @SerializedName 类似,Jackson库提供 @JsonProperty 成员属性。我得到的模型类看起来像这样:

public class FlurryAppMetric {
    @JsonProperty("@metric")
    private String metric;

    @JsonProperty("@startDate")
    private String startDate;

    @JsonProperty("@endDate")
    private String endDate;

    @JsonProperty("@generatedDate")
    private String generatedDate;

    @JsonProperty("@version")
    private String version;

    private ArrayList<FlurryMetric> day;
}

public class FlurryMetric {
    @JsonProperty("@date")
    private String date;

    @JsonProperty("@value")
    private String value;
}