2015-03-20 2 views
6

это мой JsonПокрытие json массива с использованием модификации?

[ 
{ 
    "nata_center":{ 
    "id":67, 
    "nata_center_name":"Primo Institute of Design" 
    } 
}, 
{ 
    "nata_center":{ 
    "id":68, 
    "nata_center_name":"Sai Ganesh Institute" 
    } 
} 
] 

Pojo классы

public class Explorer { 
    NataCenter nataCenter; 

    public NataCenter getNataCenter() { 
     return nataCenter; 
    } 

    public void setNataCenter(NataCenter nataCenter) { 
     this.nataCenter = nataCenter; 
    } 
} 

2)

public class NataCenter { 
    public String id; 
    public String nata_center_name; 

    public NataCenter(String id,String nata_center_name) 
    { 
     this.id=id; 
    this.nata_center_name=nata_center_name; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public String getId() { 
     return id; 
    } 

    public String getNata_center_name() { 
     return nata_center_name; 
    } 

    public void setNata_center_name(String nata_center_name) { 
     this.nata_center_name = nata_center_name; 
    } 
} 

GetMethhodinRetrofit

void getCenter(@Query("id") int id,Callback<List<Explorer>> callback); 

MainActvitiy.java

 service.getCenter(i,new Callback<List<Explorer>>() { 
         @Override 
         public void success(List<Explorer> o, Response response) { 
          Log.d(TAG,"Success" + "Response"+o.toString()); 

         @Override 
         public void failure(RetrofitError error) { 
          Log.d(TAG,"Failed"+error.toString()); 

         } 
        }); 

Это сообщение об ошибке

Failedretrofit.RetrofitError: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $ 
+0

Можете ли вы изменить что-то в JSON? –

+0

Я уверен, есть ли какие-либо проблемы с json? – Asthme

+0

Для меня нет :), но если вы добавите еще один тег, будет легче –

ответ

7

В основном проблема заключается в том, что у вас есть массив как корень в формате JSON. Вы должны создать объект, который будет использоваться в качестве контейнера для этого списка и десериализатора для этого объекта. Я использовал Explorer как контейнер, он выглядит как:

public class Explorer { 

    List<NataCenter> nataCenter; 


    public List<NataCenter> getNataCenter() { 
     return nataCenter; 
    } 

    public void add(NataCenter nataCenterItem){ 
     if(nataCenter == null){ 
      nataCenter = new LinkedList<>(); 
     } 
     nataCenter.add(nataCenterItem); 
    } 
} 

Мое решение - просто объяснение. Вы можете улучшить свой класс Explorer. Сеттер для списка - не самая лучшая идея.

NataCenter класс выглядит как предыдущий,

Один из важных думаю, ExplorerDeserializerJson класс. Он используется для десериализации json, и он выглядит следующим образом:

public class ExplorerDeserializerJson implements JsonDeserializer<Explorer> { 

    @Override 
    public Explorer deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) 
      throws JsonParseException { 
     Explorer explorer = new Explorer(); 
     JsonArray jsonArray = je.getAsJsonArray(); 
     Gson gson = new Gson(); 
     for(JsonElement element : jsonArray){ 
      JsonObject jsonObject = element.getAsJsonObject(); 
      NataCenter nataCenter = gson.fromJson(jsonObject.get("nata_center"), NataCenter.class); 
      explorer.add(nataCenter); 
     } 
     return explorer; 

    } 
} 

Кроме того, я меняю своего клиента. Теперь ответ Explorer.

void getCenter(@Query("id") int id,Callback<Explorer> callback); 

В качестве последнего вы должны зарегистрировать новый десериализатор в том месте, где вы создаете RestAdapter, как показано ниже:

RestAdapter restAdapter = new RestAdapter.Builder() 
        .setEndpoint(BuildConfig.IP) 
        .setConverter(new GsonConverter(new GsonBuilder() 
          .registerTypeAdapter(Explorer.class, new ExplorerDeserializerJson()) 
          .create())) 
        .build(); 
      restAdapter.create(CenterClient.class).getCenter(1); 
+0

i willl проверить и дать знать – Asthme

+0

@when я попробовал Log.d (TAG, o.getNataCenter(). Get (0) .getNata_center_name()); что-то вроде этого. – Asthme

+0

он показывает ошибку не может бросить .. – Asthme