2015-05-06 30 views
12

Tôi gặp nhiều rắc rối khi chuyển đổi kết quả từ api này sang JsonObject.InputStream to JsonObject - GSON

"Kết quả" không thay đổi bất kể tôi cố gắng làm gì.

URL url = new URL(urlString); 
    InputStream input = url.openStream(); 
    Reader reader = new InputStreamReader(in, "UTF-8"); 
    JsonResult result = new Gson().fromJson(reader, JsonResult.class); 

lớp JsonResult

public class JsonResult { 
    private String status; 
    private Meta meta; 
    private ArrayList<Player> players; 
} 

class Meta{ 
    private String count; 
} 

Json:

{"status":"ok","meta":{"count":12},"data":[{"nickname":"DataBase","account_id":500566109},{"nickname":"database007","account_id":514382449},{"nickname":"Database04","account_id":504367425},{"nickname":"database08","account_id":515081772},{"nickname":"database1","account_id":503282284},{"nickname":"database1221","account_id":506709044},{"nickname":"database123","account_id":508409172},{"nickname":"database1337","account_id":501661259},{"nickname":"database169","account_id":503884400},{"nickname":"database2","account_id":504337382},{"nickname":"database93","account_id":518691821},{"nickname":"databaseking66","account_id":505911069}]} 

Lưu ý: Đây là một dự án trường học

Note 2: Tôi đã kiểm tra và thử nghiệm rất nhiều giải pháp khác từ SO nhưng không tìm thấy hoặc hiểu đúng.

Sửa 1:

public class JsonResult { 
    @SerializedName("status") 
    public String status; 
    @SerializedName("meta") 
    public Meta meta; 
    @SerializedName("data") 
    public Player[] players; 
} 

class Meta{ 
    @SerializedName("count") 
    private String count; 
} 

chơi lớp

public class Player { 

    private int account_id; 
    private String nickname; 

    public Player(int account_id, String nickname){ 
     this.account_id = account_id; 
     this.nickname = nickname; 
    } 


    //Generated 
    public void setAccount_id(int account_id) { 
     this.account_id = account_id; 
    } 

    //Generated 
    public void setNickname(String nickname) { 
     this.nickname = nickname; 
    } 

    public String toString() { 
     return this.account_id + this.nickname; 
    } 
} 
+2

Bạn nói rằng bạn đã "rất nhiều rắc rối" - cũng những gì xảy ra? Mã đó có biên dịch không? Có ngoại lệ không? JSON trông như thế nào? –

+2

@Jochem liên kết của bên thứ ba được tán thành, do tính chất năng động của họ (ai đó có thể nhấp vào liên kết trong tương lai và sẽ không tìm thấy bất kỳ điều gì hữu ích). Bài đăng của bạn phải được chỉnh sửa để bao gồm mọi thứ có liên quan. _Ngoài ra một số người trong chúng ta đang đứng sau tường lửa nơi làm việc;) _ – CubeJockey

+0

@Trobbins cảm ơn, nó sẽ ở đó trong giây lát :). Tôi đã chỉnh sửa câu hỏi – JochemQuery

Trả lời

4

Trong sự thay đổi lớp JsonResult bạn

public class JsonResult { 
    private String status; 
    private Meta meta; 
    @SerializedName("data") 
    private ArrayList<Player> players; 
} 
+6

Điều quan trọng là mô tả _why_ đây là giải pháp. Lý do là Gson cố gắng ánh xạ các thuộc tính theo tên của chúng, và tên thuộc tính cho mảng của người chơi trong JSON là "dữ liệu", và không có thuộc tính với tên "dữ liệu" trong lớp JsonResult, do đó nó không thể ' t tìm một nơi để đặt nó và sẽ bỏ qua nó. Chú thích này yêu cầu trình phân tích cú pháp sử dụng trường 'trình phát' khi thấy thuộc tính "dữ liệu". –

+0

Cảm ơn bạn đã giải thích @DaveLugg và câu trả lời -Ads. Có cái gì đó vẫn cho tôi một lỗi null. Tôi đang đọc lại mã của mình và thử lại một lần nữa – JochemQuery

+0

Bạn có thể đăng lớp Người chơi của mình không? – Ads