簡體   English   中英

解析具有未知結構以與已知結構進行比較的JSON的最佳方法?

[英]Best way to parse JSON with an unknown structure for comparison with a known structure?

我有一個YAML文件,我將其轉換為JSON,然后使用GSON轉換為Java對象。 這將用作我將比較其他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對象,也無需按名稱顯式訪問每個字段?

我認為您正在尋找類似流Json Parser的東西:

這是一個例子

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM