美文网首页
JSONPath入门之Snack3篇

JSONPath入门之Snack3篇

作者: 草编椅 | 来源:发表于2019-11-27 15:47 被阅读0次

    Snack3 for java

    一个微型JSON框架

    基于jdk8,60kb。有序列化反序列化、解析和转换、支持 Json path 查询。

    <dependency>
      <groupId>org.noear</groupId>
      <artifactId>snack3</artifactId>
      <version>3.1.9</version>
    </dependency>
    

    Snack3 借鉴了 Javascript 所有变量由 var 申明,及 Xml dom 一切都是 Node 的设计。其下一切数据都以ONode表示,ONode也即 One node 之意,代表任何类型,也可以转换为任何类型。

    • 强调文档树的操控和构建能力
    • 做为中间媒体,方便不同格式互转
    • 高性能Json path查询(兼容性和性能很赞)
    • 支持序列化、反序列化

    今天用它来试一下JSONPath入门

    一、JSONPath语法介绍

    • 字符串使用单引号,例:['name']
    • 过滤操作用空隔号隔开,例:[?(@.type == 1)]
    支持操作 说明
    $ 表示根元素
    @ 当前节点(做为过滤表达式的谓词使用)
    * 通用配配符,可以表示一个名字或数字。
    .. 深层扫描。 可以理解为递归搜索。
    .<name> 表示一个子节点
    ['<name>' (, '<name>')] 表示一个或多个子节点
    [<number> (, <number>)] 表示一个或多个数组下标(负号为倒数)
    [start:end] 数组片段,区间为[start,end),不包含end(负号为倒数)
    [?(<expression>)] 过滤表达式。 表达式结果必须是一个布尔值。
    支持过滤操作符 说明
    == left等于right(注意1不等于'1')
    != 不等于
    < 小于
    <= 小于等于
    > 大于
    >= 大于等于
    =~ 匹配正则表达式[?(@.name =~ /foo.*?/i)]
    in 左边存在于右边 [?(@.size in ['S', 'M'])]
    nin 左边不存在于右边
    支持尾部函数 说明
    min() 计算数字数组的最小值
    max() 计算数字数组的最大值
    avg() 计算数字数组的平均值
    sum() 计算数字数组的汇总值(新加的)

    二、准备JSON数据

    {
        "store": {
            "book": [{
                "category": "reference",
                "author": "Nigel Rees",
                "title": "Sayings of the Century",
                "price": 8.95
            }, {
                "category": "fiction",
                "author": "Evelyn Waugh",
                "title": "Sword of Honour",
                "price": 12.99
            }, {
                "category": "fiction",
                "author": "Herman Melville",
                "title": "Moby Dick",
                "isbn": "0-553-21311-3",
                "price": 8.99
            }, {
                "category": "fiction",
                "author": "J. R. R. Tolkien",
                "title": "The Lord of the Rings",
                "isbn": "0-395-19395-8",
                "price": 22.99
            }],
            "bicycle": {
                "color": "red",
                "price": 19.95
            }
        },
        "expensive": 10
    }
    

    三、演示代码

    @Test
    public void demo1(){
        final String json = "{\"store\":{\"book\":[{\"category\":\"reference\",\"author\":\"Nigel Rees\",\"title\":\"Sayings of the Century\",\"price\":8.95},{\"category\":\"fiction\",\"author\":\"Evelyn Waugh\",\"title\":\"Sword of Honour\",\"price\":12.99},{\"category\":\"fiction\",\"author\":\"Herman Melville\",\"title\":\"Moby Dick\",\"isbn\":\"0-553-21311-3\",\"price\":8.99},{\"category\":\"fiction\",\"author\":\"J. R. R. Tolkien\",\"title\":\"The Lord of the Rings\",\"isbn\":\"0-395-19395-8\",\"price\":22.99}],\"bicycle\":{\"color\":\"red\",\"price\":19.95}},\"expensive\":10}";
    
        ONode n = ONode.load(json);
    
        ONode t1 = n.select("$.store.book [0].title");
        System.out.println("\nt1:" + t1);
    
        ONode t2 = n.select("$['store']['book'][0]['title']");
        System.out.println("\nt2:" + t2);
    
        ONode t3 = n.select("$.store.book[*].author");
        System.out.println("\nt3:" + t3);
    
        ONode t4 = n.select("$..author");
        System.out.println("\nt4:" + t4);
    
        ONode t5 = n.select("$.store.*");
        System.out.println("\nt5:" + t5);
    
        ONode t6 = n.select("$.store..price");
        System.out.println("\nt6:" + t6);
    
        ONode t7 = n.select("$..book[2]");
        System.out.println("\nt7:" + t7);
    
        ONode t8 =  n.select("$..book[-2]");
        System.out.println("\nt8:" + t8);
    
        ONode t9 = n.select("$..book[0,1]");
        System.out.println("\nt9:" + t9);
    
        ONode ta = n.select("$..book[:2]");
        System.out.println("\nta:" + ta);
    
        ONode tb = n.select("$..book[1:2]");
        System.out.println("\ntb:" + tb);
    
        ONode tc = n.select("$..book[-2:]");
        System.out.println("\ntc:" + tc);
    
        ONode td = n.select("$..book[2:]");
        System.out.println("\ntd:" + td);
    
        ONode te = n.select("$..book[?(@.isbn)]");
        System.out.println("\nte:" + te);
    
        ONode tf = n.select("$.store.book[?(@.price < 10)]");
        System.out.println("\ntf:" + tf);
    
        ONode tg = n.select("$..book[?(@.author =~ /.*REES/i)]");
        System.out.println("\ntg:" + tg);
    
        ONode th = n.select("$..*");
        System.out.println("\nth:" + th);
    
        ONode ti = n.select("$..book[?(@.price <= $.expensive)]");
        System.out.println("\nti:" + ti);
    }
    

    四、控制台输出

    t1:"Sayings of the Century"
    
    t2:"Sayings of the Century"
    
    t3:["Nigel Rees","Evelyn Waugh","Herman Melville","J. R. R. Tolkien"]
    
    t4:["Nigel Rees","Evelyn Waugh","Herman Melville","J. R. R. Tolkien"]
    
    t5:[[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}],{"color":"red","price":19.95}]
    
    t6:[8.95,12.99,8.99,22.99,19.95]
    
    t7:[{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99}]
    
    t8:[{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99}]
    
    t9:[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99}]
    
    ta:[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99}]
    
    tb:[{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99}]
    
    tc:[{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}]
    
    td:[{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}]
    
    te:[{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}]
    
    tf:[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99}]
    
    tg:[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95}]
    
    th:[{"book":[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}],"bicycle":{"color":"red","price":19.95}},[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}],{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},"reference","Nigel Rees","Sayings of the Century",8.95,{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99},"fiction","Evelyn Waugh","Sword of Honour",12.99,{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},"fiction","Herman Melville","Moby Dick","0-553-21311-3",8.99,{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99},"fiction","J. R. R. Tolkien","The Lord of the Rings","0-395-19395-8",22.99,{"color":"red","price":19.95},"red",19.95,10]
    
    ti:[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99}]
    

    相关文章

      网友评论

          本文标题:JSONPath入门之Snack3篇

          本文链接:https://www.haomeiwen.com/subject/qhipwctx.html