【问题标题】:Parsing a JSON array WITHOUT a wrapper class解析没有包装类的 JSON 数组
【发布时间】:2019-05-12 21:00:49
【问题描述】:

我正在尝试使用 Gson 将 JSON 数组解析为 Java ArrayList。

{
  "fathers": [
    {
      "name": "Donald",
      "age": 47,
      "children": [
        {
          "name": "Johnny",
          "age": 6
        },
        {
          "name": "Donna",
          "age": 15
        },
        {
          "name": "Alan",
          "age": 21
        }
      ]
    },
    {
      "name": "George",
      "age": 35,
      "children": [
        {
          "name": "Cynthia",
          "age": 10
        },
        {
          "name": "Stacey",
          "age": 5
        },
        {
          "name": "Dewey",
          "age": 2
        }
      ]
    }
  ]
}

我正在尝试将“fathers”数组解析为 ArrayList……但是,我不能直接这样做,因为fathers 数组是由 JSON 对象包装的。通常,我会这样做:

Type fathersListType = new TypeToken<ArrayList<Father>>(){}.getType();
fathersArrayList = gson.fromJson(fathersJson, fathersListType);

但是,由于父亲数组被一个对象包裹,我得到这个错误:

Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

有没有一种方法可以解析所述数组,而不必声明包含“父亲”数组的包装类?比如忽略包装对象,或者从中提取 JSON 数组。

【问题讨论】:

    标签: java json parsing arraylist wrapper


    【解决方案1】:

    您可以将根对象解析为Map

    Type rootType = new TypeToken<Map<String, List<Person>>>(){}.getType();
    Map<String, List<Person>> root = gson.fromJson(fathersJson, rootType);
    List<Person> fathersList = root.get("fathers");
    

    【讨论】:

    • 成功了,非常感谢! @Marat Strelet 的回答也有效,但是将 JSON 数组解析为 ArrayList 更容易。
    • @Noobuntu 如果您发现两个答案有用,您应该对两个答案都投赞成票。您只能接受一个答案,但您可以对多个答案投票。
    【解决方案2】:

    这样的事情应该可以工作:

    String data = "{...}"; // Your JSON
    JsonArray array = new JsonParser().parse(data).getAsJsonObject().get("fathers").getAsJsonArray();
    List<Father> fathers = Arrays.asList(new Gson().fromJson(array, Father[].class));
    

    Arrays.asList来自https://commons.apache.org/

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多