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);
我正在尝试在我的 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);