我试图在我的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请求并以字符串形式接收主体,我就可以清理响应并尝试将其传递给映射器。
答案 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;
}