Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Coverting json array using retrofit?

this is my Json

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

Pojo classes

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());

                        }
                    });

This is the error message

 Failedretrofit.RetrofitError: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
like image 927
Asthme Avatar asked Mar 20 '15 15:03

Asthme


1 Answers

Basically the problem is that you have array as root in json. You have to create object which will be used as container for this list and deserializator for this object. I used Explorer as container, it looks like below:

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);
    }
}

My solution is just explanation. You can improve your Explorer class. Setter for list is not the best idea.

The NataCenter class looks like previous,

The one of important think is ExplorerDeserializerJson class. It is used to deserialize json and it looks like below:

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;

    }
}

Additionally I change your client. Now Explorer is a response.

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

As the last you have to register new deserializer in the place where you create RestAdapter as is shown below:

 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);
like image 161
Konrad Krakowiak Avatar answered Sep 28 '22 00:09

Konrad Krakowiak