2017-03-21 27 views
7

tôi tiêu thụ một API mà mang lại cho tôi kiểu này JSON:Java/Kotlin JSON phân tích cú pháp cải thiện

{ 
    "data": { 
    "name": "Start", 
    "pid": "1", 
    "position": { 
     "data": { 
     "x": "31", 
     "y": "330" 
     }, 
     "metadata": "empty" 
    } 
    }, 
    "metadata": "empty" 
} 

Tôi đã tạo ra các lớp học với các đối tượng với cấu trúc tương tự như JSON trên. Tôi sử dụng thư viện retrofit trong Android mà bên trong sử dụng GSON để phân tích cú pháp JSON.

lớp mô hình của tôi sẽ là như thế này:

MResponse.class

User.class

public class User { 

    public String name; 

    public String pid; 

    @SerializedName("position") 
    public PositionData positionData; 
} 

PositionData.class

public class PositionData { 

    @SerializedName("data") 
    public Position position; 

    public String metadata; 
} 

Position.class

public class Position { 

    public String x; 

    public String y; 
} 

Bây giờ này hoạt động tốt đối với tôi. Nhưng như bạn có thể thấy cho mỗi mô hình, tôi phải tạo ra một phụ huynh mà sẽ có cùng một cấu trúc chỉ thay đổi đứa trẻ. Thực tế này tăng gấp đôi các lớp mà tôi sử dụng cho các mô hình của tôi. Tôi muốn hỏi xem có cách nào tốt hơn để tránh tất cả các lớp này không.

Tôi không muốn sử dụng các lớp bên trong. Tôi đã nghĩ rằng những kẻ đã thực hiện JSON như thế này phải có một lý do tại sao họ đã làm nó như thế này và cũng là một cách để làm cho việc phân tích cú pháp dễ dàng hơn.

Thường thì tôi đã được sử dụng để phân tích loại cấu trúc JSON:

{ 
    "data": { 
    "name": "Start", 
    "pid": "1", 
    "position": { 
     "x": "31", 
     "y": "330" 
    } 
    } 
} 

Và đây sẽ dễ dàng hơn nếu tôi sẽ làm theo giải pháp trên.

EDIT

Ngoài ra bất kỳ giải pháp trong Kotlin được hoan nghênh

EDIT Giải pháp 2

cho Kotlin here

+0

bình luận của tôi ở đây là có các lớp không phải là xấu nó làm cho mã của bạn có cấu trúc hơn nhưng nếu bạn muốn dễ dàng serialize và deserializing các lớp học của bạn tôi có thể đề xuất một giải pháp. – dsharew

+0

Và tôi nghĩ rằng cũng có thể tránh tạo các lớp dữ liệu này nếu bạn muốn – dsharew

+0

bất kỳ giải pháp nào được hoan nghênh :) –

Trả lời

0

Vâng giải pháp mà tôi đã yêu cầu là khá đơn giản theo ý kiến ​​của tôi, tôi chỉ không biết nó trong đầu.

Dựa trên mã nguồn của Retrofit và một số câu trả lời liên quan khác về Java generics này là câu trả lời cho vấn đề của tôi:

public class DataResponse<T, R> { 

    public T data; 

    @SerializedName("meta") 
    public R metadata; 
} 

và đây là một ví dụ làm thế nào tôi có thể sử dụng nó:

Observable<DataResponse<User, BaseMeta>> getUser() 

Đối với tôi, đây là giải pháp. Nếu có giải pháp tốt hơn, tôi sẵn sàng chấp nhận chúng.

0

Tôi không nghĩ rằng yêu cầu của bạn là có thể. Nếu có một giải pháp, sau đó nó sẽ chỉ tạo ra các lớp trung gian mà sẽ làm khá nhiều giống như những gì bạn đang làm.

Trong Kotlin, tôi sẽ làm như trên. Cứ tự nhiên thậm chí đặt nó trong một .kt file:

data class MResponse(@SerializedName("data") val user: User, 
        val metadata: String) 

data class User(val name: String, 
       val pid: String, 
       @SerializedName("position") val positionData: PositionData) 


data class PositionData(@SerializedName("position") val position: Position, 
         val metadata: String) 

data class Position(val x: String, val y: String) 
Các vấn đề liên quan