gson.fromJson returns 动态键为空

gson.fromJson returns null for dynamic keys

我正在尝试在我的 android 应用程序中使用 gson 解析以下响应:

{
    "richerich":{
        "id":19250176,
        "name":"RichERich",
        "profileIconId":744,
        "summonerLevel":30,
        "revisionDate":1425977347000
    }

    "alma":{
        "id":19250174,
        "name":"Alma",
        "profileIconId":764,
        "summonerLevel":30,
        "revisionDate":14259773423424
    }
}

键 "richeric" 是一个动态键,可能会改变,我也可以在我的响应字符串中有其他响应对象,如 "richeric"。

我为此创建 classes:

public class SummonerDto {
    private long id;
    private String name;
    private int profileIconId;
    private long revisionDate;
    private long summonerLevel;

    //getters, setters...
}

我的回复class:

public class SummonerInfoResponse {

    private Map<String, SummonerDto> summoners;

    public Map<String, SummonerDto> getSummoners() {
        return summoners;
    }

    public void setSummoners(Map<String, SummonerDto> summoners) {
        this.summoners = summoners;
    }
}

我使用以下代码:

return gson.fromJson(response, SummonerInfoResponse.class);

但它 returns 无效。谁能告诉我为什么?

谢谢。

你应该可以在没有 SummonerInfoResponse

的情况下获得 SummonerDto

这是我的主要内容:

String res = "{\"richerich\":{\"id\":19250176,\"name\":\"RichERich\",\"profileIconId\":744,\"summonerLevel\":30,\"revisionDate\":1425977347000}}";
Gson gson = new Gson();         
Map<String, SummonerDto> decoded = gson.fromJson(res, new TypeToken<Map<String, SummonerDto>>(){}.getType());

System.out.println(decoded.get("richerich").getName());

You can get more info from this similar issue.

我猜您正试图通过某些方式获取 arraylist。我不能给你一个直接的答案,你在哪里犯了错误,因为这对 Gson 的工作方式是模棱两可的。我在下面给出了一个测试代码,你可以 运行 它并根据需要进行更改你会明白为什么你不能在你的代码中转换它。

public class GsonTestFour {

public static void main(String[] args) {

    ArrayList<UserInfo> arrayList = new ArrayList<>();
    HashMap<String, UserInfo> hashMap = new HashMap<String, UserInfo>();

    UserInfo info1 = new UserInfo(0, "a", 7000, 5, 10);
    UserInfo info2 = new UserInfo(0, "b", 7050, 5, 10);
    UserInfo info3 = new UserInfo(0, "c", 7900, 5, 10);
    UserInfo info4 = new UserInfo(0, "d", 7060, 5, 10);
    UserInfo info5 = new UserInfo(0, "e", 7007, 5, 10);

    arrayList.add(info1);
    arrayList.add(info2);
    arrayList.add(info3);
    arrayList.add(info4);
    arrayList.add(info5);

    System.out.println(""+(new Gson()).toJson(arrayList));

    for (int i = 0; i < arrayList.size(); i++) {
        hashMap.put(arrayList.get(i).getUsername(), arrayList.get(i));
    }
    System.out.println("\n");
    for (int i = 0; i < hashMap.size(); i++) {
        UserInfo info = hashMap.get(arrayList.get(i).getUsername());
        System.out.println("info.getUsername()=> "+info.getUsername());
        System.out.println("info.getBalance()=> "+info.getBalance());
    }

}

}

您将需要这种数据类型

public class UserInfo {

private String username = "";
private double balance = 0;
private int selectedImage = -1;
private int bet = 0;
private int action = 0;

public UserInfo(int action, String username, double balance, int selectedImage, int bet) {
    // TODO Auto-generated constructor stub
    this.action = action;
    this.username = username;
    this.balance = balance;
    this.selectedImage = selectedImage;
    this.bet = bet;
}

public String getUsername() {
    return username;
}

public double getBalance() {
    return balance;
}

public int getSelectedImage() {
    return selectedImage;
}

public int getBet() {
    return bet;
}

public int getAction() {
    return action;
}

public void setBet(int bet) {
    this.bet = bet;
}
}

并且不要放弃 Gson,它是一个非常好的库。它节省了大量编码时间

我找到了解决方案。

我用 HashMap 扩展了我的响应 class,现在我可以获得作为 gson 对象的响应。这是完整的代码:

public class SummonerInfoResponse extends HashMap<String, SummonerDto> {


}

并使用这个:

return gson.fromJson(response, SummonerInfoResponse.class);