无法反序列化来自 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;
}