2016-05-11 6 views
0

я получаю ответ JSON в виде следующего:дооснащения 2,0 deserialising сложную структуру данных

{ 
    "result" : { 
     "status" : 0, 
     "resultItems" : { 
      "MultiItemDetails" : { 
       "min" : 3, 
       ... 
       "items" : [{ 
        "SingleItem" : { 
         "active" : false, 
         "type" : 2, 
         ... 
        } 
       }, { 
        "MultiItemDetails" : { 
         "min" : 1, 
         ... 
         "items": [{ 
          "SingleItem" : { 
           "active" : true, 
           "type" : 1, 
           ... 
          } 
         },{ 
          "SingleItem" : { 
           "active" : true, 
           "type" : 2, 
           ... 
          } 
         }] 
        } 
       }] 
      } 
     } 
    } 
} 

Что бы лучшим способом создать и организовать мои POJO,?

Спасибо!

+1

попробовать использовать http://www.jsonschema2pojo.org/ – vaibhav

+0

Нет, я не могу использовать его, так как я не знаю структуру заранее. –

+0

Структура JSON выглядит не по нраву, на верхнем уровне у вас есть MultiItemDetails, с элементами, которые представляют собой массив MultiItemDetails ... – t0mm13b

ответ

2

Модель ваши классы как этот

class Response{ 
    Result result; 
} 

class Result{ 
    int status; 
    List<Item> resultItems; 
} 

class Item{ 
    MultiItem multiItemDetails; 
    SingleItem singleItem; 
} 

class MultiItem{ 
    List<Item> items; 
    int min; 
} 

class SingleItem{ 
    boolean active; 
    int type; 
} 

реорганизовать имена полей именно к вашему JSON

+0

Я применил эту модель, и все работает плавно без внедрения десериализатора. Хорошая вещь о Retrofit (_ ** и том, что применяется здесь ** _) заключается в том, что ** она просто не учитывает, если некоторые данные из модели не указаны в ответе **. Спасибо, @RajeshBatth! –

0

Вы должны написать собственный десериализатор, который возвращает внедренный объект.

Допустим, что ваш JSON является:

{ 
    "status":"OK", 
    "reason":"some reason", 
    "content" : 
    { 
     "foo": 123, 
     "bar": "some value" 
    } 
} 

Вы бы тогда иметь Content POJO:

class Content 
{ 
    public int foo; 
    public String bar; 
} 

Тогда вы написать десериализатор:

class MyDeserializer implements JsonDeserializer<Content> 
{ 
    @Override 
    public Content deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) 
     throws JsonParseException 
    { 
     // Get the "content" element from the parsed JSON 
     JsonElement content = je.getAsJsonObject().get("content"); 

     // Deserialize it. You use a new instance of Gson to avoid infinite recursion 
     // to this deserializer 
     return new Gson().fromJson(content, Content.class); 

    } 
} 

Теперь, если вы строите a Gson с GsonBuilder и зарегистрировать десериализатор:

Gson gson = 
    new GsonBuilder() 
     .registerTypeAdapter(Content.class, new MyDeserializer()) 
     .create(); 

для более детальной информации посетите это: Get nested JSON object with GSON using retrofit

+0

Звучит многообещающе. Благодаря! –

0

Я думаю, что это может даже проще, и вам даже не нужно использовать этот класс JsonDesirializer. Просто позвольте модифицировать все для вас. Он был разработан так, чтобы отлично справляться с этим звонком JSON Rest.

public class RetrofitService { 

ContentService mContentService; 

public RetrofitService() { 

    // ... init stuff 
    // Retrofit retrofit = new Retrofit.Builder() 

    mContentService = retrofit.create(ContentService.class); 
} 

public Content getContent() throws IOException { 

Call<Result<Content>> result = mContentService.getResult(); 

retrofit2.Response<LResult<Content>> execute = result.execute(); 

return execute.body().content; 

} 



public interface ContentService { 
    @GET("somerestmethod") 
    Call<Result<Content>> getResult(); 
} 



public class Result<T> { 

@SerializedName("status") 
@Expose 
public String status; 

@SerializedName("content") 
@Expose 
public T content; 
} 

class Content{ 

@SerializedName("foo") 
@Expose 
public int foo; 
@SerializedName("bar") 
@Expose 
public String bar; 
} 
Смежные вопросы