2017-09-17 10 views
1

내 서버에 요청할 때 추가 기능을 사용하고 있습니다. 여러 요청에 대해 동일한 모델을 사용하려고하며 다른 SerializedName으로 다른 개체를 보내려고합니다. 내 POJO는 다음과 같습니다Gson set SerializedName

public class BaseModel<T> implements Serializable { 
    @SerializedName("success") 
    @Expose 
    private boolean succcess; 
    @SerializedName("data") 
    @Expose private T data; 

    public boolean isSucccess() { 
     return succcess; 
    } 

    public void setSucccess(boolean succcess) { 
     this.succcess = succcess; 
    } 

    public T getData() { 
     return data; 
    } 

    public void setData(T data) { 
     this.data = data; 
    } 
} 

어떻게 동적 방법으로 내 @SerializedName ("데이터")를 설정할 수 있습니까? 시간 내 주셔서 감사합니다.

코드 샘플 : 나는 (T 데이터로) BASEMODEL에 전송하고있는 객체의

public class BaseRequestModel<T> implements Serializable { 
    @SerializedName("success") 
    @Expose 
    private boolean success; 

    @Expose private T data; 

    public boolean isSucccess() { 
     return success; 
    } 

    public void setSucccess(boolean succcess) { 
     this.success = succcess; 
    } 

    public T getData() { 
     return data; 
    } 

    public void setData(T data) { 
     this.data = data; 
    } 
} 

하나 :

public class User implements Serializable { 

    transient String requestName = "user"; 

    @SerializedName("id") 
    @Expose 
    private int id; 

    @SerializedName("owner_id") 
    @Expose private int ownerId; 

    @SerializedName("first_name") 
    @Expose private String firstName; 

    @SerializedName("middle_name") 
    @Expose private String middleName; 

    @SerializedName("last_name") 
    @Expose private String lastName; 

    @SerializedName("username") 
    @Expose private String username; 

    public String getRequestName() { 
     return requestName; 
    } 

    public void setRequestName(String requestName) { 
     this.requestName = requestName; 
    } 

    public int getId() { 
     return id; 
    } 

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

    public int getOwnerId() { 
     return ownerId; 
    } 

    public void setOwnerId(int ownerId) { 
     this.ownerId = ownerId; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getMiddleName() { 
     return middleName; 
    } 

    public void setMiddleName(String middleName) { 
     this.middleName = middleName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

} 

내 사용자 정의 시리얼 : 내가 가진

public class BaseRequestCustomSerializer<T> implements JsonSerializer<User> { 
    @Override 
    public JsonElement serialize(User src, Type typeOfSrc, JsonSerializationContext context) { 
     src.getRequestName(); 
     return null; 
    } 
} 

특정 객체 대신 시리얼 라이저로 전달해야한다. 내 문제가 전부이기 때문이다. 어떤 아이디어? 고맙습니다!

+0

내 의견으로는 개조하려고 시도한 것에 직관적이지는 않지만 약간의 소리가 들리지만 사용자 지정 serializer를 작성할 수 있습니다. 필드의 이름을 쉽게 확인할 수 있도록 "일시적인 문자열 이름"필드가있을 수도 있습니다. – Fred

+0

@ Fred 그래서 SerializedName을 사용하지 말고 대신 일시적인 String 이름을 초기화해야합니까? 내 사건에 좀 더 구체적으로 대답 해 줄 수 있니? (나는 gson & retrofit의 초보자입니다.) – Alphonse

+0

그것은 단지 아이디어였습니다. 그렇습니다. 당신은''@ SerializedName''을 제거 할 것입니다. 왜냐하면 그것이 효과적으로 더 이상 작동하지 않을 것이기 때문입니다. gson에 사용자 정의 시리얼 라이저를 추가하면됩니다 (https://google.github.io/gson/apidocs/com/google/gson/JsonSerializer.html).''serialize'' 메소드는 객체를받습니다. 직렬화 프로세스에서 사용할 이름을 알려주는 속성을 오브젝트에 가지고 있어야합니다. 이 속성은 결과로 나오는 json에 나타나서는 안되기 때문에''transient''로 표시 할 것입니다. 이 모든 것은 비 직렬화를 위해 작동하지 않지만 요청 부분 만 언급했습니다. – Fred

답변

0

@SerializedName ("data")을 설정하려면 api 응답에서 동일한 변수 이름을 가져야합니다.