我正在尝试使用Gson将本地文件加载到我的Android应用程序中。在文件中加载工作正常。以下是Json的样子:
{"heroes" : [
{
"hero": {
"name": "Hanzo",
"role": "Offense",
"abilities": {
"primary": "left click",
"secondary": "right click",
"ultimate": "dragons"
},
"strongAgainst": [
"Bastion",
"Mercy"
],
"weakAgainst": [
"Genji",
"Tracer"
]
},
"hero": {
"name": "Torbjorn",
"role": "Defense",
"abilities": {
"primary": "left click",
"secondary": "right click",
"ultimate": "lava bastard"
},
"strongAgainst": [
"Lucio",
"Mercy"
],
"weak_against": [
"Widowmaker",
"Junkrat"
]
}
}
]}
我创建了3个带有getter和setter的POJO:
public final class Heroes {
private List<Hero> hero;
}
public class Hero {
private HeroAttr hero;
}
public class HeroAttr {
private String name;
private String role;
private Abilities abilities;
private List<String> strongAgainst;
private List<String> weakAgainst;
}
public class Abilities {
private String primary;
private String secondary;
private String ultimate;
}
我像这样使用Gson加载:
Gson gson = new GsonBuilder().create();
Heroes h = gson.fromJson(byteArrayOutputStream.toString(), Heroes.class);
每当我尝试从h
获取大小或打印内容时,它会给我一个空对象引用,而我无法从arraylist中获取任何内容。
我甚至尝试将json文件仅用于数组并使用
Hero[] h = gson.fromJson(byteArrayOutputStream.toString(), Hero[].class);
但是我得到了同样的问题 - 空对象引用。
有什么想法吗?感谢。
答案 0 :(得分:1)
<强>已更新强>
您的JSON出现问题:
{
"hero": {
"name": "Hanzo",
"role": "Offense",
"abilities": {
"primary": "left click",
"secondary": "right click",
"ultimate": "dragons"
},
"strongAgainst": [
"Bastion",
"Mercy"
],
"weakAgainst": [
"Genji",
"Tracer"
]
},
"hero": {
"name": "Torbjorn",
"role": "Defense",
"abilities": {
"primary": "left click",
"secondary": "right click",
"ultimate": "lava bastard"
},
"strongAgainst": [
"Lucio",
"Mercy"
],
"weak_against": [
"Widowmaker",
"Junkrat"
]
}
}
这不是理智的。两次定义hero
属性的对象。
完整版应为:
{
"heroes" : [
{
"name": "Hanzo",
"role": "Offense",
"abilities": {
"primary": "left click",
"secondary": "right click",
"ultimate": "dragons"
},
"strongAgainst": [
"Bastion",
"Mercy"
],
"weakAgainst": [
"Genji",
"Tracer"
]
},
{
"name": "Torbjorn",
"role": "Defense",
"abilities": {
"primary": "left click",
"secondary": "right click",
"ultimate": "lava bastard"
},
"strongAgainst": [
"Lucio",
"Mercy"
],
"weak_against": [
"Widowmaker",
"Junkrat"
]
}
]
}
完整代码(返回三个POJO):
import com.google.gson.Gson;
import java.util.List;
public class Test {
String json = "{\n" +
" \"heroes\" : [\n" +
" {\n" +
" \"name\": \"Hanzo\",\n" +
" \"role\": \"Offense\",\n" +
" \"abilities\": {\n" +
" \"primary\": \"left click\",\n" +
" \"secondary\": \"right click\",\n" +
" \"ultimate\": \"dragons\"\n" +
" },\n" +
" \"strongAgainst\": [\n" +
" \"Bastion\",\n" +
" \"Mercy\"\n" +
" ],\n" +
" \"weakAgainst\": [\n" +
" \"Genji\",\n" +
" \"Tracer\"\n" +
" ]\n" +
" },\n" +
" {\n" +
" \"name\": \"Torbjorn\",\n" +
" \"role\": \"Defense\",\n" +
" \"abilities\": {\n" +
" \"primary\": \"left click\",\n" +
" \"secondary\": \"right click\",\n" +
" \"ultimate\": \"lava bastard\"\n" +
" },\n" +
" \"strongAgainst\": [\n" +
" \"Lucio\",\n" +
" \"Mercy\"\n" +
" ],\n" +
" \"weak_against\": [\n" +
" \"Widowmaker\",\n" +
" \"Junkrat\"\n" +
" ]\n" +
" }\n" +
" ]\n" +
"}";
static class Heroes {
public List<Hero> heroes;
}
static class Hero {
public String name;
public String role;
public Abilities abilities;
public List<String> strongAgainst;
public List<String> weakAgainst;
}
static class Abilities {
public String primary;
public String secondary;
public String ultimate;
}
void go() {
Gson gson = new Gson();
Heroes h = gson.fromJson(json, Heroes.class);
System.out.println(h.heroes.size());
System.out.println(h.heroes.get(0).name);
}
public static void main(String[] args) {
new Test().go();
}
}