Gson没有正确加载 - Null对象引用

时间:2016-06-03 17:02:33

标签: android json gson

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

但是我得到了同样的问题 - 空对象引用。

有什么想法吗?感谢。

1 个答案:

答案 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();
    }
}