2017-05-25 12 views
2

サーバーからJSON応答を解析しようとしていますが、POSTメソッドで送信されたクエリに変更があった場合、最初に応答として取得します。 2番目の応答として応答します。Retrofit 2、同じ名前の異なるデータ型JSON構文解析

1:

{ 
    "status": 1, 
    "data": { 
     "firstname": "First Name", 
     "lastname": "Last Name", 
     "mobilenumber": "1234567894", 
     "emailid": "[email protected]", 
     "timezone": "Asia/Kolkata" 
    }, 
    "user_id": "", 
    "response": "Profile Updated Successfully" 
} 

2:

{ 
    "status": 1, 
    "data": "No changes to update", 
    "user_id": "" 
} 

変更は何も文字列としてdataリターンを変更がない場合dataは、オブジェクトを返すがある場合は、あなたが見ることができるように。

私はこのメソッドを使用してデータを取得しています。私はデータをマップするためにGson Convertorを使用しています。

これは、要求インタフェース

@FormUrlEncoded 
@POST("pondguard/updateprofile") 
Call<UserResponse> getInfoUpdated(@Field("user_id") String user_id, 
            @Field("firstname") String firstName, 
            @Field("lastname") String lastName, 
            @Field("mobilenumber") String mobileNumber, 
            @Field("emailid") String emailID) 

であり、これは私のPOJOクラス

public class UserResponse implements Parcelable { 

    public static final Creator<UserResponse> CREATOR = new Creator<UserResponse>() { 
     @Override 
     public UserResponse createFromParcel(Parcel in) { 
      return new UserResponse(in); 
     } 

     @Override 
     public UserResponse[] newArray(int size) { 
      return new UserResponse[size]; 
     } 
    }; 
    private String status; 
    private Data data; 
    private String response; 
    private String error; 

    protected UserResponse(Parcel in) { 
     status = in.readString(); 
     data = in.readParcelable(Data.class.getClassLoader()); 
     response = in.readString(); 
    } 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(status); 
     dest.writeParcelable(data, flags); 
     dest.writeString(response); 
    } 

    public String getStatus() { 
     return status; 
    } 

    public Data getData() { 
     return data; 
    } 

    public String getResponse() { 
     return response; 
    } 

    public String getError() { 
     return error; 
    } 
} 

と私が作る最終的にレトロフィット呼び出しです:あなたがそのように使用することはできません

Retrofit retrofit = new Retrofit.Builder() 
     .baseUrl(ConstantUtils.BASE_URL) 
     .addConverterFactory(GsonConverterFactory.create()) 
     .build(); 

UserInfoRequestInterface requestInterface = retrofit.create(UserInfoRequestInterface.class); 
Call<UserResponse> call = requestInterface.getInfoUpdated(user_id, firstName, lastName, phoneNumber, email, null, null); 
+1

データ更新がない場合はクエリに関係なく同じ応答を送信するようにサーバーの担当者に指示します。 –

答えて

4

をご提案いただきありがとうございます、これを試してみてください私は働く方法を考え出しました。ここで私はそれをしたか...

最初に、私のPojoクラスで、私はJsonDeserializerを追加し、 "データ"がオブジェクトかプリミティブであるかどうかをチェックし、それに応じてそれぞれのフィールドを設定します。

public class UserResponse { 

    @SerializedName("status") 
    private String status; 
    @SerializedName("data") 
    private Object mData; 
    @SerializedName("response") 
    private String response; 
    @SerializedName("error") 
    private String error; 

    private String message; 
    private String firstname; 
    private String lastname; 
    private String mobilenumber; 
    private String emailid; 
    private String timezone; 

    public String getMessage() { 
     return message; 
    } 

    public void setMessage(String message) { 
     this.message = message; 
    } 

    public String getFirstname() { 
     return firstname; 
    } 

    public void setFirstname(String firstname) { 
     this.firstname = firstname; 
    } 

    public String getLastname() { 
     return lastname; 
    } 

    public void setLastname(String lastname) { 
     this.lastname = lastname; 
    } 

    public String getMobilenumber() { 
     return mobilenumber; 
    } 

    public void setMobilenumber(String mobilenumber) { 
     this.mobilenumber = mobilenumber; 
    } 

    public String getEmailid() { 
     return emailid; 
    } 

    public void setEmailid(String emailid) { 
     this.emailid = emailid; 
    } 

    public String getTimezone() { 
     return timezone; 
    } 

    public void setTimezone(String timezone) { 
     this.timezone = timezone; 
    } 

    public String getStatus() { 
     return status; 
    } 

    public void setStatus(String status) { 
     this.status = status; 
    } 

    public Object getmData() { 
     return mData; 
    } 

    public String getResponse() { 
     return response; 
    } 

    public String getError() { 
     return error; 
    } 

    public static class DataStateDeserializer implements JsonDeserializer<UserResponse> { 

     @Override 
     public UserResponse deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
      UserResponse userResponse = new Gson().fromJson(json, UserResponse.class); 
      JsonObject jsonObject = json.getAsJsonObject(); 

      if (jsonObject.has("data")) { 
       JsonElement elem = jsonObject.get("data"); 
       if (elem != null && !elem.isJsonNull()) {      
        if(elem.isJsonPrimitive()){        
         userResponse.setMessage(elem.getAsString()); 
        }else{ 

         userResponse.setFirstname(elem.getAsJsonObject().get("firstname").getAsString()); 
         userResponse.setLastname(elem.getAsJsonObject().get("lastname").getAsString()); 
         userResponse.setMobilenumber(elem.getAsJsonObject().get("mobilenumber").getAsString()); 
         userResponse.setEmailid(elem.getAsJsonObject().get("emailid").getAsString()); 
         userResponse.setTimezone(elem.getAsJsonObject().get("timezone").getAsString()); 
        } 
       } 
      } 
      return userResponse ; 
     } 
    } 
} 

と私はGSONビルダーのタイプのアダプタにJSONデシリアライザを添付して、この

Gson gson = new GsonBuilder() 
       .registerTypeAdapter(UserResponse.class, new UserResponse.DataStateDeserializer()) 
       .create(); 

Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(ConstantUtils.BASE_URL) 
       .addConverterFactory(GsonConverterFactory.create(gson)) 
       .build(); 

UserInfoRequestInterface requestInterface = retrofit.create(UserInfoRequestInterface.class); 
     Call<UserResponse> call = requestInterface.getInfoUpdated(user_id, firstName, lastName, phoneNumber, email, null, null); 

のようなレトロフィットにGsonConvertorの方法を作成するためにそれを与えるそれから私がしなければならないすべては、メッセージがあるかどうかを確認でそれに応じて必要な処置を実行してください。

+0

私は同様の問題がありますが、UserResponseでjava.lang.IllegalStateExceptionが発生しています。userResponse = new Gson()。fromJson(json、UserResponse.class); アイデア – WinterChilly

+0

ありがとうございました。 –

0

。応答にはstatusフィールドがあります。 statusファイルを使用して、存在するデータがないかどうかを確認してください。例えば:

ステータスが1の場合:

{ 
    "status": 1, 
    "data": { 
    "firstname": "First Name", 
    "lastname": "Last Name", 
    "mobilenumber": "1234567894", 
    "emailid": "[email protected]", 
    "timezone": "Asia/Kolkata" 
}, 
"user_id": "<userId>", 
"response": "Profile Updated Successfully" 
} 

statusが0の場合:

{ 
    "status": 0, 
    "data": { 
    "firstname": "", 
    "lastname": "", 
    "mobilenumber": "", 
    "emailid": "", 
    "timezone": "" 
}, 
"user_id": "", 
"response": "An error message" 
} 
+0

ステータス0が異なる場合の応答。 status、error、およびuser_idがあります。 –

0

try { 
     // "data" returns an object 
     JSONObject jsonObjectData = jsonObject.getJSONObject("data"); 
     //rest of your code 
    } catch (JSONException e){ 
     //"data" returns a string 
     e.printStackTrace(); 
     try { 
      String data = jsonObject.getString("data"); 
     } catch (JSONException e1) { 
      e1.printStackTrace(); 
     } 
    } 
+0

ありがとう、私は別の方法を考え出し、答えを掲載しました。 –

関連する問題