Java 用Gson解析复杂的嵌套JSON数据
我使用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。(对于最后一个,我可能有兴趣在上循环更多的,以
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());
}