当前位置: 首页 > 知识库问答 >
问题:

使用Gson库动态解析未知数据

韶镜
2023-03-14

我想在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字段?。。但对我来说不起作用。。我也有内部泛型类。

  1. 我在这里找到了解决办法https://stackoverflow.com/a/23473650/7790252.实现反序列化器来模拟学校和学生等类

共有3个答案

从光启
2023-03-14

创建实现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
    }
}
桓修能
2023-03-14

来自Gson文档

 Type mapType = new TypeToken<Map<Integer, Result> >() {}.getType(); // define generic type
Map<Integer, Result> result= gson.fromJson(new InputStreamReader(source), mapType);
栾昂雄
2023-03-14

您可以简单地使用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,请改用。该代码对我有用: