InputStream到JsonObject - GSON

Joc*_*ery 16 java android gson

将结果从这个api转换为JsonObject我遇到了很多麻烦.

无论我尝试做什么,"结果"都保持为空.

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

JsonResult类

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

class Meta{
    private String count;
}
Run Code Online (Sandbox Code Playgroud)

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}]}
Run Code Online (Sandbox Code Playgroud)

注意:这是针对学校项目的

注2:我确实从SO检查并测试了很多其他解决方案,但没有找到或理解正确的解决方案.

编辑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;
}
Run Code Online (Sandbox Code Playgroud)

球员班

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ads*_*Ads 8

在您的 JsonResult 类中更改

public class JsonResult {
    private String status;
    private Meta meta;
    @SerializedName("data")
    private ArrayList<Player> players;
}
Run Code Online (Sandbox Code Playgroud)

  • 描述_为什么_这是解决方案很重要。原因是Gson试图通过名字来映射属性,而JSON中播放器数组的属性名是“data”,而JsonResult类中没有名字为“data”的属性,所以不能'找不到地方放它,然后就省略了。此注释告诉解析器在看到“data”属性时使用“players”字段。 (11认同)
  • @vzamanillo 在那里有注释意味着他可以在任何地方访问他的球员名单,人们不会对其内容感到困惑。如果他在他的字段中使用“数据”,那么他可能会在稍后的代码中对其进行迭代,而查看的人将不知道“数据”代表什么。以变​​量包含的内容命名变量是一个应该遵循的好习惯。JochemQuery 当然,这取决于您,但我会保留它。每次稍后在代码中访问玩家数组时,更容易理解它所指的内容。 (2认同)