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

解析未知结构的JSON以便与已知结构进行比较的最佳方法?

澹台展鹏
2023-03-14

我有一个YAML文件,我转换成JSON,然后使用GSONJava对象。这将被用作标准定义,我将与其他YAML文件进行比较。我将要验证的YAML文件应该包含与我的定义具有相同结构的字段。然而,它很有可能包含具有不同结构的字段,以及在我的定义中不存在的字段,因为最终由用户在我接收文件之前创建这些字段。要验证的YAML中的字段可以是这样的,可以选择用户希望定义的嵌套级别。

 LBU:
      type: nodes.Compute
      properties:
        name: LBU
        description: LBU
        configurable_properties: 
          test: {"additional_configurable_properties":{"aaa":"1"}}
        vdu_profile:
          min_number_of_instances: 1
          max_number_of_instances: 4
      capabilities:
        virtual_compute:
          properties:
            virtual_memory:
              virtual_mem_size: 8096 MB
            virtual_cpu:
              cpu_architecture: x86
              num_virtual_cpu: 2
              virtual_cpu_clock: 1800 MHz
      requirements:
      - virtual_storage:
          capability: capabilities.VirtualStorage
          node: LBU_Storage        

目前,我收到这个YAML文件,并使用Gson将其转换为JsonObject。由于任何可能的未知字段,无法将其映射到Java对象。我的目标是运行此文件,并根据定义中的匹配字段验证每个字段。如果存在定义中不存在的字段,或者确实存在但属性不同的字段,则我需要向用户提供有关该字段的特定信息。

到目前为止,我正沿着这样的路线获得田地。

 for (String field : obj.get("topology_template").getAsJsonObject().get("node_template").getAsJsonObject().get(key).getAsJsonObject().get(
              obj.get("topology_template").getAsJsonObject().get("node_templates").getAsJsonObject().get(key).getAsJsonObject().keySet().toArray()[i].toString()).getAsJsonObject().keySet()) {

然而,对于一些深度嵌套的字段来说,这似乎是相当过度的,并且很难遵循。

我想知道的是,是否有一种更简单的方法来遍历JsonObject的每个字段,而无需将其映射到Java对象,也无需通过名称显式访问每个字段?

共有1个答案

通飞尘
2023-03-14

我认为您正在寻找类似于流式Json解析器的东西:

这里有个例子

String json
  = "{\"name\":\"Tom\",\"age\":25,\"address\":[\"Poland\",\"5th avenue\"]}";
JsonFactory jfactory = new JsonFactory();
JsonParser jParser = jfactory.createParser(json);

String parsedName = null;
Integer parsedAge = null;
List<String> addresses = new LinkedList<>();

while (jParser.nextToken() != JsonToken.END_OBJECT) {
    String fieldname = jParser.getCurrentName();
    if ("name".equals(fieldname)) {
        jParser.nextToken();
        parsedName = jParser.getText();
    }

    if ("age".equals(fieldname)) {
        jParser.nextToken();
        parsedAge = jParser.getIntValue();
    }

    if ("address".equals(fieldname)) {
        jParser.nextToken();
        while (jParser.nextToken() != JsonToken.END_ARRAY) {
            addresses.add(jParser.getText());
        }
    }
}
jParser.close();

请在这里找到留档:https://github.com/FasterXML/jackson-docs/wiki/JacksonStreamingApi

 类似资料:
  • 我想得到一个表示 json 的字符串,如下所示: 并在其中包含一个“count”键,因此结尾如下: 这就是为什么我计划将其转换为 json,以便我可以添加计数,然后再次使其成为字符串。问题是我不知道该 JSON 的结构,所以我无法使用

  • 简短版本: 我希望能够将结构转换为元组。至少是那种类型。在下面的代码中,convertToTuple函数不起作用,因为可变参数不能用于结构化绑定(据我所知)。关键是:自动 基本上,我需要的是一种将自定义结构的类型转换为元组的方法,元组包含结构中的所有类型。例如: 具体问题: 我想创建一个模板函数,它将一个类型或一个类型列表作为模板参数,并生成一个纹理列表,每个纹理包含一个项目。另一个函数可以对纹理

  • 问题内容: 比较运算符的 “ Go编程语言规范”部分使我相信,仅包含可比较字段的结构应具有可比性: 如果结构的所有字段都是可比较的,则它们的值是可比较的。如果两个结构值对应的非空白字段相等,则它们相等。 这样,由于“ Student”结构中的所有字段都是可比较的,因此我希望编译以下代码: 但是,它无法使用以下消息进行编译: 无效的操作:alice> = carol(运算符> =未在结构上定义) 我

  • 问题内容: 是否有人对未知结构的NSDictionary进行了递归有序遍历?我想学习任何NSDictionary,并按层次结构顺序处理每个级别。 1)此数据来自经过验证的JSON。可以肯定地说,从诸如SBJSON(JSON框架)之类的框架创建的NSDictionary仅会导致嵌套字典,数组和任意叶的组合吗? 2)如何使用适用于数组和字典的快速枚举完成泛型遍历?使用下面的代码,一旦我到达数组中的字典

  • 本文向大家介绍JVM内存结构相关知识解析,包括了JVM内存结构相关知识解析的使用技巧和注意事项,需要的朋友参考一下 最近在看《 JAVA并发编程实践 》这本书,里面涉及到了 Java 内存模型,通过 Java 内存模型顺理成章的来到的 JVM 内存结构,关于 JVM 内存结构的认知还停留在上大学那会的课堂上,一直没有系统的学习这一块的知识,所以这一次我把《 深入理解Java虚拟机JVM高级特性与最

  • 本文向大家介绍json的结构与遍历方法实例分析,包括了json的结构与遍历方法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了json的结构与遍历方法。分享给大家供大家参考,具体如下: 第一种json结构: 遍历的方法是: 第二种json结构: 遍历方法: PS:关于json操作,这里再为大家推荐几款比较实用的json在线工具供大家参考使用: 在线JSON代码检验、检验、美化、格式