JSON与Jsonpath

简单介绍

  • json:是一种轻量级的数据交换格式,key value形式的,值可以是字符串,json对象、数组。

json常见函数:
json.dumps(python_obj) 将数据类型转换成字符串
json.loads(json_string) 将字符串转换成json对象
json.dump() 将数据类型转换成字符串并存储再文件中
json.load(file_stream) 把文件打开,把里面的字符串转换成数据类型

  • jsonpath:An XPath for JSON ,JsonPath是一种简单的方法来提取给定JSON文档的部分内容。 JsonPath有许多编程语言,如Javascript,Python和PHP,Java。

JsonPath提供的json解析非常强大,它提供了类似正则表达式的语法,基本上可以满足所有你想要获得的json内容。
官网:http://goessner.net/articles/JsonPath

语法格式与例子

用网上找到的一个经典json对象来做原材料,进行jsonpath的玩耍吧,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
    }
  }
}

1.基本语法
1.1基本操作符:

  • $ 根节点,即jsonpath的入口
  • . 或者 [] 用于连接父子节点
    注意 所有的命令前面都有一个美元符号,不知道为啥文章不显示
    eg . store.book. category不能获取值,因为book的值是一个数组,需要这样写. store.book[1]. category,得到的是一个字符串
    [] 区别:节点名必须加上单引号或者双引号,得到的是一个新的json对象,可以继续操作
    [' store']['book']
    [' store']['book']['category']
    结果:['reference', 'fiction', 'fiction', 'fiction']
  • .. 深层扫描,获取当前节点及其子节点下的所有指定对象
  • *通配符
  • 如果值是数组,需要进一步处理,对数组的处理方式有三种,分别是
    第一种:索引(多个索引用逗号隔开),比如. store.book[1:3]
    第三种:过滤表达式 格式:数组名[?(表达式)]
    表达式的基本操作符: == != > >= < <=
    =~ 正则匹配
    In Nin Subsetof(子集) || 或 && 并且
    eg:$. store.book[?(@ category=='fiction')]即可获得
    { "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
    }
$. store.book[?(@title =~/J.?/)] 匹配所有title以J开头并且后面跟了一个字符的

函数
$. store.book[?(@price.min()>=10)] 可以把价格筛选出来
函数有:Min() Max() Avg() Stddev() Length()

python中jsonpath的使用

import jsonpath

book = { "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
    }
  }
}

tmp = jsonpath.jsonpath(book,'$.store.book[*].category')  # 如果取不到返回false
tmp1 = jsonpath.jsonpath(book,'$.store.book[?(@.price>=22.99)]')  # 如果取不到返回false

print(tmp,tmp1)

输出:['reference', 'fiction', 'fiction', 'fiction']
[{'category': 'fiction', 'author': 'J. R. R. Tolkien', 'title': 'The Lord of the Rings', 'isbn': '0-395-19395-8', 'price': 22.99}]

你可能感兴趣的:(JSON与Jsonpath)