无法反序列化来自 Flurry API 的 json 响应
Can't deserialize json response from Flurry API
我正在尝试使用 Flurry 的 REST API 将一些统计信息读入我的 Spring 应用程序。但是,我的对象返回时所有字段都为空值。我认为这是因为 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 如下(省略 getter 和 setter):
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 请求并将正文作为字符串接收,我将能够清理响应并尝试将其传递给映射器。
您应该能够使用 GSON 解析它,使用 @SerializedName
注释,如下所示:
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);
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;
}
我正在尝试使用 Flurry 的 REST API 将一些统计信息读入我的 Spring 应用程序。但是,我的对象返回时所有字段都为空值。我认为这是因为 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 如下(省略 getter 和 setter):
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 请求并将正文作为字符串接收,我将能够清理响应并尝试将其传递给映射器。
您应该能够使用 GSON 解析它,使用 @SerializedName
注释,如下所示:
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);
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;
}