使用jmespath第三方模块提取json数据

在工作中经常需要查找json里面的某个key的值,如果json层级太深,使用字典自带的get方法,比较麻烦。
这里演示一下第三方模块jmespath提取json键、值。

pip install jmespath

一、基本操作

查询key对应的value

import jmespath

source = {"a": "foo", "b": "bar", "c": "baz"}
result = jmespath.search('b', source)
print(repr(result))

结果:‘bar’

使用.操作符

source1 = {"a": {"b": {"c": {"d": "value"}}}}
result1 = jmespath.search('a.b.c', source1)
print(repr(result1))

结果:{‘d’: ‘value’}

下标操作,仅用于数组

source_2 = ["a", "b", "c", "d", "e", "f"]
index_result = jmespath.search("[1]",source_2)
print(repr(index_result))

结果:‘b’

下标和.操作符混合操作

source3 = {"a": {
  "b": {
    "c": [
      {"d": [0, [1, 2]]},
      {"d": [3, 4]}
    ]
  }
}}
result3 = jmespath.search('a.b.c[0].d[1][0]',source3)
print(repr(result3))
结果:1

二、切片

source_4 = ["a", "b", "c", "d", "e", "f"]
result4 = jmespath.search("[1:3]",source_4)
print(repr(result4))

结果:[‘b’, ‘c’]

二、投影

投影其实就是初始时定义好格式,然后按照格式的方式进行取值。
投影主要包括以下几种:

  • List Projections列表投影
  • Slice Projections切片投影
  • Object Projections对象投影
  • Flatten Projections正则投影
  • Filter Projections过滤条件投影

注意:取列表用[],取字典用.

# List and Slice Projections
source5 = {
  "people": [
    {"first": "James", "last": "d"},
    {"first": "Jacob", "last": "e"},
    {"first": "Jayden", "last": "f"},
    {"missing": "different"}
  ],
  "foo": {"bar": "baz"}
}
result5 = jmespath.search('people[*].first', source5)
print(result5)

结果:[‘James’, ‘Jacob’, ‘Jayden’]

# Object Projections
# Whereas a list projection is defined for a JSON array, an object projection is defined for a JSON object. You can create an object projection using 
# the * syntax.
source6 = {
  "ops": {
    "functionA": {"numArgs": 2},
    "functionB": {"numArgs": 3},
    "functionC": {"variadic": True}
  }
}
result6 = jmespath.search('ops.*.numArgs', source6)
print(repr(result6))

结果:[3, 2]

# Filter Projections带过滤条件投影
# 格式[? <expression> <comparator> <expression>]
# 支持 ==, !=, <, <=, >, >=
# In this example we’re searching through the people array. Each element in this array contains a hash of two elements, and each value in the hash
# is itself a hash. We’re trying to retrieve the value of the general key that contains an age key with a value above 20.
source7 = {
  "people": [
    {
      "general": {
        "id": 100,
        "age": 20,
        "other": "foo",
        "name": "Bob"
      },
      "history": {
        "first_login": "2014-01-01",
        "last_login": "2014-01-02"
      }
    },
    {
      "general": {
        "id": 101,
        "age": 30,
        "other": "bar",
        "name": "Bill"
      },
      "history": {
        "first_login": "2014-05-01",
        "last_login": "2014-05-02"
      }
    }
  ]
}
result7 = jmespath.search("people[?general.age > `20`].general | [0]", source7)
print(repr(result7))

{‘id’: 101, ‘other’: ‘bar’, ‘age’: 30, ‘name’: ‘Bill’}

更多jmspath使用方法参考:

jmespath官方API

猜你喜欢

转载自blog.csdn.net/a200822146085/article/details/90044086
今日推荐