How to handle Dynamic JSON in Retrofit?

后端 未结 10 2382
余生分开走
余生分开走 2020-11-22 16:23

I am using the retrofit efficient networking library, but I am unable to handle Dynamic JSON which contains single prefix responseMessage which changes to

10条回答
  •  广开言路
    2020-11-22 16:56

    Try custom deserialisation using gson-converter as below(updated answer for Retrofit 2.0)

    Create three models as shown below

    ResponseWrapper

    public class ResponseWrapper {
    
        @SerializedName("applicationType")
        @Expose
        private String applicationType;
        @SerializedName("responseMessage")
        @Expose
        private Object responseMessage;
    
        public String getApplicationType() {
            return applicationType;
        }
    
        public void setApplicationType(String applicationType) {
            this.applicationType = applicationType;
        }
    
        public Object getResponseMessage() {
            return responseMessage;
        }
    
        public void setResponseMessage(Object responseMessage) {
            this.responseMessage = responseMessage;
        }
    
    }
    

    ResponseMessage

    public class ResponseMessage extends ResponseWrapper {
    
    @SerializedName("surname")
    @Expose
    private String surname;
    @SerializedName("forename")
    @Expose
    private String forename;
    @SerializedName("dob")
    @Expose
    private String dob;
    @SerializedName("refNo")
    @Expose
    private String refNo;
    @SerializedName("result")
    @Expose
    private String result;
    
    public String getSurname() {
        return surname;
    }
    
    public void setSurname(String surname) {
        this.surname = surname;
    }
    
    public String getForename() {
        return forename;
    }
    
    public void setForename(String forename) {
        this.forename = forename;
    }
    
    public String getDob() {
        return dob;
    }
    
    public void setDob(String dob) {
        this.dob = dob;
    }
    
    public String getRefNo() {
        return refNo;
    }
    
    public void setRefNo(String refNo) {
        this.refNo = refNo;
    }
    
    public String getResult() {
        return result;
    }
    
    public void setResult(String result) {
        this.result = result;
    }
    
    }
    

    ResponseString

    public class ResponseString extends ResponseWrapper {
    
    }
    

    UserResponseDeserializer(custom deserialiser)

    public class UserResponseDeserializer implements JsonDeserializer {
    @Override
    public ResponseWrapper deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
    
    
            if (((JsonObject) json).get("responseMessage") instanceof JsonObject){
                return new Gson().fromJson(json, ResponseMessage.class);
            } else {
                return new Gson().fromJson(json, ResponseString.class);
            }
    
    }
    }
    

    Retrofit 2.0 Implementation

    Gson userDeserializer = new GsonBuilder().setLenient().registerTypeAdapter(ResponseWrapper.class, new UserResponseDeserializer()).create();
    
    
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("base_url")
                .addConverterFactory(GsonConverterFactory.create(userDeserializer))
                .build();
    
    
        UserService request = retrofit.create(UserService.class);
        Call call1=request.listAllUsers();
    
        call1.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                ResponseWrapper responseWrapper=response.body();
                Log.i("DYNAMIC RESPONSE", String.valueOf(response.body().getResponseMessage()));
            }
    
            @Override
            public void onFailure(Call call, Throwable t) {
            }
        });
    

    Libraries Used

    compile 'com.squareup.retrofit2:retrofit:2.3.0'

    compile 'com.squareup.retrofit2:converter-gson:2.3.0'

    ***** Previous Answer (above answer is more recommended one) *****

    Change your pojo like this

    public class TrackerRefResponse {
    
      private String applicationType;
      private Object responseMessage;
    
      public Object getResponseMessage() {
      return responseMessage;
      }
    
      public void setResponseMessage(Object responseMessage) {
      this.responseMessage = responseMessage;
     }
    }
    

    and change retrofit's onResponse like this

     @Override
    public void onResponse(Response response) {
        if (response.isSuccess()) {
            if (response.getResponseMessage() instanceof String)
                {
                handleStringResponse();
             }
            else 
                {
                handleObjectResponse();
             }
        }
    }
    

    you may also check this post for more details about dynamic json parsing

提交回复
热议问题