代码之家  ›  专栏  ›  技术社区  ›  AnOldSoul

在json文件中查找预定义模式属性的最佳方法

  •  1
  • AnOldSoul  · 技术社区  · 9 年前

    我有一个json模式文件,它遵循我创建的自定义规则。此模式文件是有效的json文件。它遵循以下模式。

     {
        "name":   {
                    "fname" :  {
                                 "displayName":"FirstName",
                                 "dataType":"String"
                               }
                    "lname"  : {
                                 "displayName":"LastName",
                                 "dataType":"String"
                               }
                   },
        "address": {
                       "displayName":"Address",
                       "dataType":"String"
                   }
      }
    

    因此,基于该模式,我需要创建下面的json和相应的值。

      {
           "name": {
                     "FirstName": "test",
                     "LastName" : "test1"
                   },
           "Address" : "someAddress"
      }
    

    因此,当我得到模式时,找到配置信息节点的最佳方法是什么?即具有显示名称和数据类型参数的叶节点。目前,我正在使用Jackson json遍历这棵树,并找到具有displayName和dataType键的节点。因为我不能准确地说这个叶节点可以出现在哪个级别。有没有比遍历整个json树寻找元素更好的方法来处理这种情况?

    1 回复  |  直到 9 年前
        1
  •  1
  •   Sharon Ben Asher    9 年前

    fname 对象或其属性的值), JsonPath 看起来很适合这里。它相当于基于各种标准的json搜索层次结构模型的xpath

    我做了一个小演示让你开始。您只需要tweak查询字符串以满足您的需求。您可以使用 Jayway JsonPath Evaluator 作为答复

    import java.nio.file.*;
    import com.jayway.jsonpath.*;
    public class JsonPathDemo
    {
        public static void main(String[] args)
        {
            // query: get all json objects that have displayName and dataType properties
            String jsonPathQuery = "$..*[?(@.displayName && @.dataType)]";
            try {
                String content = new String(Files.readAllBytes(Paths.get("C://temp/xx.json")));
                Object parsedContent = Configuration.defaultConfiguration().jsonProvider().parse(content);
                Object configElements = JsonPath.read(parsedContent, jsonPathQuery);
                System.out.println(configElements.getClass());
                System.out.println(configElements);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    } 
    

    输出是

    class net.minidev.json.JSONArray
    [{"displayName":"Address","dataType":"String"},{"displayName":"FirstName","dataType":"String"},{"displayName":"LastName","dataType":"String"}]
    

    编辑: 回答评论中的问题:

    可以使用以下方法检查路径是否存在(并进行各种其他断言): json-path-assert :

    import static com.jayway.jsonpath.matchers.JsonPathMatchers.*;
    
    // query for specific path 
    String jsonSpecificPathQuery = "$..name.fname.displayName";
    
    String content = new String(Files.readAllBytes(Paths.get("C://temp/xx.json")));
    Object parsedContent = Configuration.defaultConfiguration().jsonProvider().parse(content);
    System.out.println("hasJsonPath? " + hasJsonPath(jsonSpecificPathQuery).matches(parsedContent));