2016-03-02 30 views
21

Trong dự án android của tôi, tôi có hai loại phản hồi trong đó cả hai đáp ứng giống hệt nhau trừ hai phím.Gson - Đọc giá trị bằng hai phím khác nhau

đáp ứng 1

{"fullName":"William Sherlock Scott Holmes","address":"221B Baker Street, London, England, UK","downloads":642,"rating":3,"repos":["https://link1","https://link2","https://link3"]} 

đáp ứng 2

{"name":"Sherlock","city":"London","downloads":642,"rating":3,"repos":["https://link1","https://link2","https://link3"]} 

Nếu bạn thấy câu trả lời chỉ có hai cái tên quan trọng đang thay đổi FullName/tênđịa chỉ/thành phố

tôi don không muốn tạo thêm một pojo cho phản ứng khác. Bây giờ, Câu hỏi của tôi là, Chỉ có thể sử dụng một Pojo để đọc cả hai câu trả lời.

public class AccountInfo { 
    private String name; 
    private String city; 
    //other objects 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getCity() { 
     return city; 
    } 

    public void setCity(String city) { 
     this.city = city; 
    } 
    //other setters and getters 
} 

Bất kỳ trợ giúp sẽ được đánh giá cao ...

+2

Hãy chắc những trường bổ sung getter và setter, nếu trường getter là trống rỗng, nó sẽ không tạo ra bất kỳ vấn đề nào. Hãy thử điều này và cho tôi biết nếu tôi có thể giúp bạn với bất kỳ điều gì khác –

+1

@Rakshit cảm ơn. kiểm tra Doug Stevenson câu trả lời .. – Bharatesh

Trả lời

37

Bạn có thể chú thích các thành viên chấp nhận các giá trị từ hai tên json khác nhau bằng cách sử dụng @SerializedName chú thích:

@SerializedName(value = "name", alternate = {"fullName"}) 
private String name; 
@SerializedName(value = "city", alternate = {"address"}) 
private String city; 

Hoặc tên là yếu tố sau đó có thể được đặt vào thành viên được chú thích như thế này.

CẬP NHẬT: @SerializedName tên thay thế khi deserializing được thêm vào trong Version 2.4

+0

Cảm ơn anh chàng .... – Bharatesh

+0

nhận java.lang.IllegalArgumentException: Không thể tạo trình chuyển đổi cho lớp học –

0

Vâng bạn có thể làm điều đó trong một POJO duy nhất. Hãy thử điều này:

public class POJO { 

@SerializedName("name") 
public String name; 

@SerializedName("city") 
public String city; 

@SerializedName("fullName") 
public String fullName; 

@SerializedName("address") 
public String address; 

@SerializedName("downloads") 
public Integer downloads; 

@SerializedName("rating") 
public Integer rating; 

@SerializedName("repos") 
public List<String> repos = new ArrayList<String>(); 

} 

Trong khi phân tích cú pháp, bạn phải kiểm tra giá trị cho rỗng. Đối với ví dụ -

Trong khi phân tích cú pháp đáp ứng 1: tênthành phố biến sẽ được null

Trong khi phân tích cú pháp đáp ứng 2: fullnameđịa chỉ sẽ được null

Lưu ý: Hãy thử kiểm tra các giá trị cho null trước khi sử dụng khác, bạn sẽ nhận được nullpointerexception

+0

Cảm ơn rất nhiều ... @ Doug Stevenson câu trả lời là sử dụng nhiều hơn vì tôi không phải kiểm tra 'null'. – Bharatesh

+0

Cách tiếp cận xấu để làm điều này –

1

Vâng, bạn hoàn toàn có thể sử dụng một lớp POJO cho deserializing cả câu trả lời. Lớp POJO của bạn sẽ chứa các khóa từ cả hai câu trả lời.

public class Response { 


private String name; 
private String city; 
private String fullName; 
private String address; 
private Integer downloads; 
private Integer rating; 
private List<String> repos ; 

} 

Nhưng khi sử dụng lớp Response, hãy cẩn thận rằng cho phản ứng đầu tiên, các tênthành phố sẽ rỗng, và cho thứ hai, địa chỉ tên đầy đủ.

0

Xác định tất cả các lĩnh vực có thể trong POJO Lớp của bạn như

public class AccountInfo { 
     private String name; 
     private String city; 
     private String fullname; 
     private String address; 
    } 

Trong khi thực hiện kiểm tra hoạt động cho null trong những feilds

+0

. cảm ơn câu trả lời ... Nhưng bạn không kiểm tra các câu trả lời khác cũng giống như những gì bạn trả lời ... – Bharatesh

Các vấn đề liên quan