2015-06-17 2 views
0

Я пытаюсь прочитать некоторые статистические данные, используя API REST от Flurry в моем приложении Spring. Однако мои объекты возвращаются с нулевыми значениями для всех полей. Я думаю, это связано с тем, что ответ JSON добавляет символы @ к полям без массива в ответе. Ответы я получаю выглядеть следующим образом:Невозможно десериализовать ответ json от Flurry API

{ 
    "@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 следующий (добытчики & сеттеров опущенные):

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 и получить тело в виде строки, я смогу очистить ответ и попытаться передать его в картограф.

ответ

1

вы должны быть в состоянии разобрать его с 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); 
+1

Хорошо, что мне не нужно было бы манипулировать строкой JSON. Я все еще не уверен, какие классы я должен использовать для создания запроса GET весной, чтобы получить тело ответа в виде строки. –

+1

Если Flurry использует GSON, вы можете просто добавить аннотацию к модели и оставить реализацию FlurryAppMetric как есть: D – reidzeibel

1

reidzeibel меня на правильном пути. Я использую парсер Jackson FasterXML, потому что это то, что использует org.springframework.web.client.RestTemplate за кулисами. Подобно библиотеке GSON @SerializedName, библиотека Джексона предоставляет свойство участника @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; 
} 
+0

Рад, что это работает! на самом деле я также регулярно пользуюсь Джексоном, отвечал на GSON, потому что его использует модифицированный вариант: D – reidzeibel

+0

Правильно, я использую только Джексон, потому что этот клиентский класс REST, предоставленный Spring, использует его под обложками. : D –

Смежные вопросы