Java 用Gson解析复杂的嵌套JSON数据

Java 用Gson解析复杂的嵌套JSON数据,java,json,object,nested,gson,Java,Json,Object,Nested,Gson,我使用Gson解析JSON字符串。我想使用容器类和嵌入的静态类将其转换为对象。在某种程度上这是可能的,但我想将stuff1和stuff2的内容视为数组,例如,stuff1是一个包含other\u stuff1和other\u stuff2的数组。这样我就可以以如下方式引用对象:object.integer、object.stuff1.get(“其他_stuff1”).name、或object.stuff2.get(“其他_stuff3”).more。(对于最后一个,我可能有兴趣在上循环更多的,以

我使用Gson解析JSON字符串。我想使用容器类和嵌入的静态类将其转换为对象。在某种程度上这是可能的,但我想将
stuff1
stuff2
的内容视为数组,例如,
stuff1
是一个包含
other\u stuff1
other\u stuff2
的数组。这样我就可以以如下方式引用对象:
object.integer
object.stuff1.get(“其他_stuff1”).name
、或
object.stuff2.get(“其他_stuff3”).more
。(对于最后一个,我可能有兴趣在
上循环更多的
,以获得每个项目

例如,在PHP中,我将使用以下内容:

<?php
    echo "<pre>";
    $object = json_decode(file_get_contents("THE JSON FILENAME"));
    foreach($object->stuff1 as $name=>$data) {
        echo $name . ":\n"; // other_stuff1 or other_stuff2
        echo $unlockable->description . "\n\n"; // Got lots of stuff or Got even more stuff.
    }
?>
我已经阅读了许多参考指南和教程,但我找不到一种方法来解释这一点


如果有人能给我一个指针,我将不胜感激。我找不到任何教程考虑到a)我希望数组样式列表中有多个对象,可通过ID引用(如
其他填充1
其他填充2
),b)我还希望能够在不提供ID的情况下循环项目。

您应该定义一个Java类,其中的字段以所需的键命名。您可以使用s(而不是数组)来获取所描述的
.get(“key”)
行为。例如:

Container c = gson.fromJson(jsonString, Container.class);
for(Stuff s : c.getStuff1().values()) {
  System.out.println(s.getName());
}

将容器中的字段声明为
Map
而不是
HashMap
,这难道还不够吗?@ralfstx一个快速测试表明,如果您指定
Map
Gson,就会生成一个。还有一个有时可能会返回的。可能最好明确说明您想要的类型(例如,
HashMap
LinkedHashMap
,等等),但是如果您只指定
Map
作为所需类型,Gson将使用合理的默认值。这些映射实现在迭代时保持元素的原始顺序,这可能是需要的
HashMap
Map
接口的一个流行实现,但是对于
容器类型的用户来说,这个实现是不相关的。我不确定你在说什么,但是OP应该使用适合他们的实现。使用
Map
将实现留给Gson,这可能是不可取的。对你的类型明确是一个好主意,这绝对是完美的。现在看来,使用HashMap似乎是一个不错的选择,因为它对我来说是最容易使用的,但我可以放心地说,我已经能够使用您的代码,并将其完全转化为我想要的。谢谢
class Container {
  private final int integer;
  private final HashMap<String, Stuff> stuff1;
  private final HashMap<String, Stuff> stuff2;
}

class Stuff {
  private final String name;
  private final String description;
  @SerializedName("boolean") private final boolean bool;
  private final HashMap<String, Option> more;
}

class Option {
  private final String name;
}
Container c = gson.fromJson(jsonString, Container.class);
for(Stuff s : c.getStuff1().values()) {
  System.out.println(s.getName());
}