如何使用Gson解析此JSON?我有一个具有多个对象类型的数组,但我不知道需要创建哪种对象来保存此结构。我无法更改json消息(我无法控制服务器)。
唯一起作用的类是
html" target="_blank">public class Response {
private List<Object> tr;
private int results;
(...)
}
JSON消息 (请注意具有多个对象类型的数组。)
{
"tr":
[
{
"a":
{
"userId": "112"
}
},
{
"b":
{
"userId": "123",
"address":"street dummy"
}
},
{
"a":
{
"userId": "154"
}
}
],
"results":3
}
《 Gson用户指南》明确涵盖了以下内容:
https://sites.google.com/site/gson/gson-user-guide#TOC-Serializing-and-
Deserializing-Collection-with-Objects-of-Arbitrary-
Types
您有一个对象,该对象的字段tr
是包含任意类型的数组。
用户指南说明您不能直接反序列化这种结构,并建议:
使用Gson的解析器API(低级流解析器或DOM解析器JsonParser)来解析数组元素,然后在每个数组元素上使用Gson.fromJson()。这是首选方法。
在您的情况下,这实际上取决于该数组中可能存在的对象。如果它们都将具有相同的内部对象,则需要执行以下操作…
List<MyUserPojo> list = new ArrayList<MyUserPojo>();
JsonArray array = parser.parse(json).getAsJsonObject().getAsJsonArray("tr");
for (JsonElement je : array)
{
Set<Map.Entry<String,JsonElement>> set = je.getAsObject().entrySet();
JsonElement je2 = set.iterator().next().getValue();
MyUserPojo mup = new Gson().fromJson(je2, MyUserPojo.class);
list.add(mup);
}
当然,这需要在具有tr
and results
字段的实际对象的自定义解串器中。
class MyPojo
{
List<MyUserPojo> userList;
int results;
}
class MyUserPojo
{
String userId;
String address;
}
class MyDeserializer implements JsonDeserializer<MyPojo>
{
@Override
public MyPojo deserialize(JsonElement je, Type type, JsonDeserializationContext jdc)
throws JsonParseException
{
List<MyUserPojo> list = new ArrayList<MyUserPojo>();
JsonArray array = je.getAsJsonObject().getAsJsonArray("tr");
for (JsonElement je2 : array)
{
Set<Map.Entry<String,JsonElement>> set = je2.getAsObject().entrySet();
JsonElement je3 = set.iterator().next().getValue();
MyUserPojo mup = new Gson().fromJson(je3, MyUserPojo.class);
list.add(mup);
}
MyPojo mp = new MyPojo();
mp.tr = list;
mp.results = je.getAsObject().getAsJsonPrimitive("results").getAsInt();
return mp;
}
}
现在您已经准备就绪-您可以使用该反序列化器并创建您的对象:
Gson gson = new GsonBuilder()
.registerTypeAdapter(MyPojo.class, new MyDeserializer())
.build();
MyPojo mp = gson.fromJson(json, MyPojo.class);
如果a
,b
等是重要的......嗯,你必须明白这一点。但是上面的内容应该可以使您更好地理解处理JSON结构所需的内容。
为了完整起见,解决此问题的唯一“方法”是,如果这些类型的数量相当有限,并且内部对象的字段也受到很大限制。您可以创建一个包含所有可能性的POJO:
class MyPojo
{
MySecondPojo a;
MySecondPojo b;
...
MySecondPojo f;
}
class MySecondPojo
{
String userId;
String address;
...
String someOtherField;
}
当Gson反序列化JSON时,会将您的POJO中的所有缺失字段设置为null
。您现在tr
可以List
在POJO中包含一个或多个数组。再次强调一下,
这确实很棘手,而且做错了方法 ,但是我想我会解释直接解析该数组需要什么。
问题内容: 如何使用gson解析json?我有一个具有多种对象类型的json数组,但我不知道我需要创建哪种对象来保存此结构。我无法更改json数据格式(我不控制服务器)。我可以使用gson或其他库解析此json数组,怎么办? 这是json代码块: 问题答案: 这个json结构本质上是gson不友好的。即您不能在Java中对此进行清晰建模,因为“对象”键引用了动态类型。您可以使用此结构做的最好的事情
问题内容: 例如: 因为json数组被解码为go数组,并且go数组需要显式定义类型,所以我不知道如何处理它。 问题答案: 首先,json无效,对象必须具有键,因此它应该类似于或just 。 而当您处理多种随机类型时,只需使用即可。
我有一些json数据,看起来像 解析器被“无法构造值的实例(不存在创建者,如默认构造)”所阻塞:没有双精度/双参数构造函数/工厂方法从数字值反序列化(1.572553780732E9)” 我的数据类看起来像:
问题内容: 我正在尝试使用gson将json字符串转换为对象。 我在下面有一个非常简单的示例,它可以运行,但是结果答案为空,即:我的Answer对象的文本字段为空。 问题答案: 因为您的JSON与您的课程不符。 现在,您的JSON是一个对象数组,每个对象包含一个对象作为字段。 JSON的处理方式如下所示: 编辑以添加评论: 如果您无法更改输出,则需要一个“包装器”。就像是: 并使用这些数组。这就是
问题内容: 在我们的应用程序中有一个相当普遍的模式。我们在Xml中配置一组配置对象(或列表)的对象,它们全部实现一个公共接口。在启动时,应用程序读取Xml并使用JAXB创建/配置对象列表。我从来没有想过(多次阅读各种文章之后)仅使用JAXB的“正确方法”。 例如,我们有一个interface ,以及多个具体的实现类,它们具有一些共同的属性,一些不同的属性以及非常不同的行为。我们用来配置应用程序使用
问题内容: 我正在练习继承。 我有两个相似的类,我想将其同化为一个数组,因此我想将Object类用作超类,因为所有内容都是Object的子类。 因此,例如,我将T类和CT类放入一个名为all的数组中,如下所示: 我跳过了声明,因为那不是我的问题。 当我希望使用循环在数组内调用函数时,我真正的问题就变成了: T和CT分别涉及的类都具有beingShot方法,该方法是公共的。 Eclipse建议将它们