2016-04-05 1 views
0

Я использую retroft и gson для запроса/ответа в своем приложении.
Структура JSON я получаю от сервера для объекта JSON, как:Deserialze json с ключевым словом wrapper с Gson

{ 
"data": { 
"name": "Rogelio Volkman", 
"address": "27299 Will Bridge Suite 058\nWest Reubenhaven, MI 00736", 
"lat": 54.65, 
"lng": 111.75, 
"phone": "+26(4)5015498663", 
"user": { 
    "data": [ 
    { 
     "name": "Mehrdad" 
    } 
    ] 
    } 
    } 
} 

Как вы видите, каждая модель обернута вокруг data ключевого слова.
Для ответа JSON массива результат как:

{ 
"data": [ 
{ 
    "name": "Rogelio Volkman", 
    "address": "27299 Will Bridge Suite 058\nWest Reubenhaven, MI 00736", 
    "lat": 54.65, 
    "lng": 111.75, 
    "phone": "+26(4)5015498663", 
    "user": { 
    "data": [ 
     { 
     "name": "Mehrdad" 
     } 
    ] 
    } 
}, 
{ 
    "name": "Jovani Ritchie", 
    "address": "920 Winona Lake\nAlisashire, GA 27145", 
    "lat": -32.57, 
    "lng": 134.6, 
    "phone": "442.530.4166", 
    "user": { 
    "data": [ 
     { 
     "name": "Mehrdad" 
     } 
    ] 
    } 
} 
} 

Теперь я хочу создать класс, который deserialises тезисы ответов с GSON, но я не implementJsonDeserializer<DataObjectModel> может, так как в методе deserialize я не знаю Wheter для звонка je.getJsonObject("data") или je.getJsonArray("data"). Как десериализовать этот ответ?

ответ

0

«data» - это массив JSON, поэтому вам нужно использовать je.getJsonArray («данные»).

Если вы используете модификацию, вы можете десериализовать этот JSON в POJO с помощью GSON Converter Factory. POJO можно создать с помощью этого сайта: http://www.jsonschema2pojo.org/

Хороший учебник по модернизации для ваших нужд является здесь: https://guides.codepath.com/android/Consuming-APIs-with-Retrofit

+1

ответил на мой вопрос, не читая вопрос первым? Я просил десериализацию с ключевым словом '' data'' – Mehrdad

+0

@Mehrdad, извините, но ваш стиль письма очень запутан для меня, и трудно понять, что вы на самом деле хотите в своем вопросе. Тем не менее, вы можете использовать описанный подход из моего ответа, и он будет работать без проблем. –

0

Создать класс POJO для ответа т.е. создать класс модели и использовать @SerializedName аннотацию как показано ниже

public class Data{ 
    @SerializedName("name") 
    String name; 
    @SerializedName("address") 
    String address; 
    @SerializedName("lat") 
    double lat; 
    ..... 
} 

И десериализовать все, что вам нужно сделать, это использовать следующий код

String dataString = responseObject.getString("data"); 
    Data[] dataArray = new Gson().fromJson(dataString,Data[].class); 

Сообщите мне, если у вас есть сомнения.

+0

Это было бы нормально, но поскольку я использую '' retrofit'', данные обрабатываются в методах обратного вызова, у меня нет доступа к ответу как простая строка '' String'' – Mehrdad

+0

. Вы получаете ответ jsonObject от права доработки. Вы можете использовать object.toString(); –

0

сделать две gson модели классов -

Class UserObject { 
     @SerializedName("data") 
     User user; 
    } 
    Class User { 
     // User object 
    } 
    Class UserArray { 
     @Serialized("data") 
     User[] list; 
    } 

    Object json = new JSONTokener(data).nextValue(); 
    if (json instanceof JSONObject) { 
     //you have an object 
     new Gson().fromJson(json,UserObject.class); 
    } else if (json instanceof JSONArray) { 
     new Gson.fromJson(json,UserArray.class); 
    } 
0

его прекрасно сделать:

@Override 
     public DataObjectModel deserialize(JsonElement json, Type type, 
              JsonDeserializationContext context) throws JsonParseException { 

      JsonElement data = ((JsonObject) json).get("data"); 
      if(data.isJsonArray()) { 
       JsonArray dataArr = data.getAsJsonArray(); 
       //do smth with array 
      } else { 
       JsonObject dataObj = data.getAsJsonObject(); 
       //do smth with object 
      } 
      ... 
+0

Как я могу зарегистрировать класс десериализатора для типа данных '' List'' модели. Я попробовал '' новый GsonBuilder(). RegisterTypeHierarchyAdapter (Museum.class, новый DataObjectDeserializer()). RegisterTypeAdapter (Museum []. Class, new DataObjectDeserializer()). Create(); '' Но это не сработало – Mehrdad

+0

, что беззаботно Не работает? вам необходимо передать созданный gson на завод преобразователя при его создании «GsonConverterFactory.create (gson)» – djodjo

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