Coverting json array using retrofit?

后端 未结 1 670
一整个雨季
一整个雨季 2021-01-05 12:01

this is my Json

[  
{  
  \"nata_center\":{  
     \"id\":67,
     \"nata_center_name\":\"Primo Institute of Design\"
  }
 },
{  
  \"nata_center\":{  
              


        
相关标签:
1条回答
  • 2021-01-05 12:23

    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);
    
    0 讨论(0)
提交回复
热议问题