我想在Android Studio中使用Gson库解析以下JSON数据。但是数据是通用的...不知道数据中有什么键(对象)...
在学校物体下——有1103号物体。
在这个物体下,我们有shoolname,shortname,students,同样在students下,有id,比如2201,2202。。。这些物体是动态的,不知道会有什么反应。。
所以问题是如何解析这个json字符串在Android使用Gson?
或者任何其他解决方案都是受欢迎的
{
"schools": {
"home": "1103",
"statelevel": "1348"
},
"school": {
"1103": {
"schoolname": "Indira School",
"nameshort": "ind",
"students": {
"2201": {
"name": "Ritesh",
"isCR": true,
"maths": {
"score": 95,
"lastscore": 86
}
},
"2202": {
"name": "Sanket",
"maths": {
"score": 98,
"lastscore": 90
}
},
"2203": {
"name": "Ajit",
"maths": {
"score": 94,
"lastscore": 87
}
}
}
},
"1348": {
"schoolname": "Patil School",
"nameshort": "pat",
"students": {
"3201": {
"name": "Ravi",
"maths": {
"score": 95,
"lastscore": 86
}
},
"3202": {
"name": "Raj",
"isCR": true,
"maths": {
"score": 98,
"lastscore": 90
}
},
"3203": {
"name": "Ram",
"maths": {
"score": 94,
"lastscore": 87
}
}
}
}
}
}
我已经提到了如何用GSON解析动态JSON字段?。。但对我来说不起作用。。我也有内部泛型类。
创建实现JsonDeserializer
的模型对象
@Override
public ActivityEvents deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
JsonObject jObject = jsonElement.getAsJsonObject();
for (Map.Entry<String, JsonElement> entry : jObject.entrySet()) {
entry.getKey(); //here you can get your key
gson.fromJson(entry.getValue(), StudebtInfo.class);; //here you can get value for key
}
}
来自Gson文档
Type mapType = new TypeToken<Map<Integer, Result> >() {}.getType(); // define generic type
Map<Integer, Result> result= gson.fromJson(new InputStreamReader(source), mapType);
您可以简单地使用java。util。Map
这是一个关联键/值容器,其中键和值是任意对象,可以使用Gson直接与JSON动态对象对齐。您只需定义适当的映射(我将字段折叠以节省一些视觉空间):
final class Response {
@SerializedName("schools") final HomeSchool school = null;
@SerializedName("school") final Map<Integer, School> schools = null;
}
final class HomeSchool {
@SerializedName("home") final int home = Integer.valueOf(0);
@SerializedName("statelevel") final int stateLevel = Integer.valueOf(0);
}
final class School {
@SerializedName("schoolname") final String name = null;
@SerializedName("nameshort") final String shortName = null;
@SerializedName("students") final Map<Integer, Student> students = null;
}
final class Student {
@SerializedName("name") final String name = null;
@SerializedName("isCR") final boolean isCr = Boolean.valueOf(false);
@SerializedName("maths") final Maths maths = null;
}
final class Maths {
@SerializedName("score") final int score = Integer.valueOf(0);
@SerializedName("lastscore") final int lastScore = Integer.valueOf(0);
}
现在,一旦有了映射,就可以轻松地反序列化JSON:
private static final Gson gson = new Gson();
public static void main(final String... args) {
final Response response = gson.fromJson(JSON, Response.class);
for ( final Entry<Integer, School> schoolEntry : response.schools.entrySet() ) {
final School school = schoolEntry.getValue();
System.out.println(schoolEntry.getKey() + " " + school.name);
for ( final Entry<Integer, Student> studentEntry : school.students.entrySet() ) {
final Student student = studentEntry.getValue();
System.out.println("\t" + studentEntry.getKey()
+ " " + student.name
+ " CR:" + (student.isCr ? "+" : "-")
+ " (" + student.maths.score + ", " + student.maths.lastScore + ")"
);
}
}
}
1103英迪拉学校
2201礼教学校(95,86)
2202圣吉学校(98,90)
2203阿吉特学校(94,87)
1348帕蒂尔学校
3201拉维学校(95,86)
3202拉吉学校(98,90)
3203拉姆学校(94,87)
类型标记建议在一定程度上是正确的:它们用于反序列化不能或没有具体映射的对象,例如某个对象的列表,或字符串到某个对象的映射。在您的例子中,Gson只是分析字段声明来解析映射类型(键和值)。
我试图在Reformation/gson中解析下面的json响应,特别是这个json 我尝试使用Map 但我总是得到回应。正文()为空。我是否需要创建实现JsonDeserializer的自定义json去序列化器并传递给gson生成器?
问题内容: 因此,我使用GSON来从API解析JSON,并被困在如何解析数据中的动态字段上。 这是查询返回的JSON数据的示例: 我当前处理单个静态值的方式是使用一个类: 然后我可以简单地使用GSON来解析它: 我知道这对子数据有效,因为我可以查询并获得单个条目并非常轻松地解析该条目,但是为数组中每个值给出的随机整数值呢?(即30655845和2868874) 有什么帮助吗? 问题答案: 根据GS
问题内容: 我有一个像这样的JSON文件: 在文件具有根元素之前,我将使用: 代码,但我不认为如何将类编码为根元素是一个数组。 我试过使用: 与: 但是还没有运气。使用这种方法我还能怎么读呢? PS我有这个工作使用: 但是我更想知道如何使用这两种方法(如果可能)。 问题答案: 问题是由放置在数组中的JSON对象(在 每种 情况下)的末尾逗号引起的: 如果删除它们,您的数据将成为 和 应该工作正常。
附言:我用这个来工作: 但我更希望知道如何做到这一点(如果可能的话)与这两种方法。
问题内容: 我在解析从javascript获取的JSON时遇到问题。JSON的格式是这样的: 到目前为止,我已经能够做到这一点: 但是我现在还需要用这些位置创建一个类。我一直在上课,因为我先尝试打印输出,但是我无法进一步细分它。我收到此错误消息: java.lang.IllegalStateException:这不是JSON数组。 我的代码是这样的: 我也尝试过这种方式: 在这种情况下,我得到:
问题内容: 这可能很简单,但是我在文档中找不到任何内容,因此使用谷歌搜索没有帮助。我正在尝试定义一个状态,在该状态下,我需要在服务器上单击以提取所需数据的URL取决于状态URL参数。简而言之,类似于: 上面的方法不起作用。我尝试注入以获取所需的参数,但是没有运气。什么是正确的方法? 问题答案: 您关系密切。如果使用ui-router,请改用。该代码对我有用: