2016-09-07 4 views
0

Я пытаюсь использовать JSON с использованием retrofit2 и GSON.Как подготовить результаты JSON в Retrofit2 (перед отправкой в ​​GsonConverterFactory)

Ниже приведен ответ, предоставленный сервером. Обратите внимание, что значение «d» является строкой действительного JSON (после удаления косых черт).

{ "d": " [{\" Число \ ": \" 2121 \ "\ "NumberOfAppearances \": 2, \ "Призы \":
[{\" DrawDate \ ": \" \/Дата (1439654400000) \/\ ", \" PrizeCode \ ": \" S \ "}, {\" DrawDate \ ": \" \/Date (874771200000) \/\ ", \ «PrizeCode \»: \ «S \»}]}] "}

есть ли способ использовать retrofit2 для preparse в в JSON во время вызова retrofitService, чтобы получить объекты внутри значения г ?

Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(BASE_URL) 
      //is there anything i can do here to do preparsing of the results? 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 

IQueryLocations = retrofit.create(IMyQuery.class); 

//currently GsonResults is the string value of d, instead of the JSON objects 
Call<GsonResult> result = IMyQuery.doQuery("2121"); 

В идеале я хотел бы вставить вызов метода перед addConverterFactory, чтобы сделать preparsing

выходе из метода preparsing будет какая-то вещь, как в следующем:

{ «г» : [{«Number»: «2121», «NumberOfAppearances»: 2, «Призы»:
[{«DrawDate»: 1439654400000, «PrizeCode»: «S»}, {«DrawDate»: 874771200000, «PrizeCode ":" S "}]}]}

+1

Это не представляется возможным preparse реакцию, как у вас нет ответ в начале. Таким образом, самый простой способ - получить исходный ответ от модификации, а затем проанализировать в соответствии с вашими потребностями. –

ответ

1

Это не ваше идеальное решение, но вы можете вернуть обертку для результата данных:

class WrappedGsonResult { 
    private static final Gson GSON = new Gson(); 

    @SerializedName("d") 
    private String data; 

    GsonResult() {} 

    public GsonResult getData() { 
     return GSON.fromJson(this.data, GsonResult.class); 
    } 
} 

Тогда:

Call<WrappedGsonResult> result = IMyQuery.doQuery("2121"); 
result.enqueue(new Callback() { 
    @Override 
    public void onResponse(final Call<WrappedGsonResult> call, final Response<WrappedGsonResult> response) { 
     if (response.isSuccessful()) { 
      GsonResult result = response.body().getData(); 
      // ... 
     } else { 
      // ... 
     } 
    } 

    // ... 
}); 
0

Чтобы исключить двойные кавычки, вам необходимо использовать excludeFieldsWithoutExposeAnnotation() от GsonBuilder.

Например:

Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); 

Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(BASE_URL) 
      // Add Gson object 
      .addConverterFactory(GsonConverterFactory.create(gson)) 
      .build(); 

Надеется, что это помогает.

+1

'excludeFieldsWithoutExposeAnnotation' делает:' "Настраивает Gson, чтобы исключить все поля из рассмотрения для сериализации или десериализации, у которых нет аннотации Expose", которая не имеет ничего общего с кавычками. –

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