Analyse et résumé de la syntaxe commune de la fonction du module jsonpath en python

jsonpath est un outil d'extraction de valeurs clés utilisé dans les données au format json. En python, la bibliothèque jsonpath a été packagée pour que nous puissions l'installer et l'utiliser. Voici comment l'utiliser——

Installer:

pip installer jsonpath

Ou téléchargez le package d'installation dans l'interpréteur pycharm

 
Définition de la fonction :

def jsonpath(obj, expr, result_type='VALUE', debug=0, use_eval=True) :
    """Traverser un objet JSON à l'aide de jsonpath expr, renvoyant des valeurs ou des chemins"""

Signification du paramètre :

obj : les données réelles qui doivent être traitées

expr : expression jsonpath

result_type : Le type du résultat renvoyé, la valeur par défaut est « VALUE » indiquant la valeur des données renvoyées, « IPATH » indiquant la clé des données renvoyées.

debug : s'il faut activer le mode débogage. La valeur par défaut est 0, ce qui signifie qu'il est fermé. Si ce n'est pas 0, cela signifie qu'il est activé.

use_eval : lorsque debug=1, coopérer avec le débogage

(Les deux derniers paramètres ne sont pas couramment utilisés. Si vous souhaitez en savoir plus, vous pouvez consulter la documentation officielle)

Syntaxe couramment utilisée :

jsonpath expliquer                                  
$ élément racine
. ou [] élément enfant
.. requête récursive
@ élément actuel
* tous les éléments
?() Appliquer une expression de filtre ; doit généralement être utilisée conjointement avec [? (@ )]
[] (tableau) opérateur d'indice
[,] Sélectionner plusieurs champs
Vous pouvez également découper [m:n], mais vous ne pouvez pas l'utiliser comme ceci [-1]
() Expression de script, utilisée sous le moteur de script

** Ajouter des paramètres result_type='IPATH' peut renvoyer le nom de la clé

Exemple de code :

import jsonpath


a = {
    "score": [
        {"name": "张三",
         "语文": 75,
         "数学": 90,
         "英语": 91, },
        {"name": "李四",
         "语文": 78,
         "数学": 95,
         "英语": 90, },
        {"name": "王五",
         "语文": 90,
         "数学": 95,
         "英语": 90, },
        {"name": "王六",
         "语文": 90,
         "数学": 95,
         "英语": 90,
         "extra": 80},
        {"name": "老李",
         "语文": 90,
         "数学": 95,
         "英语": 90,
         "extra": 90}
    ],
    "school": "社会大学"
}

# 字典对象[键名],可以获取到对应键值。
# 所以,a["name"]可以取到'张三',a["score"]["语文"]

# $ 表示根键,键和键之间使用 . 链接,如 $.score 表示根键下的score键中的所有的值
print(jsonpath.jsonpath(a, "$.score"))
# [[{'name': '张三', '语文': 75, '数学': 90, '英语': 91}, {'name': '李四', '语文': 78, '数学': 95, '英语': 90}, {'name': '王五', '语文': 90, '数学': 95, '英语': 90}, {'name': '王六', '语文': 90, '数学': 95, '英语': 90}]]

# $.score[0] 表示根键下的第一个score值
print(jsonpath.jsonpath(a, "$.score[0]"))
# [{'name': '张三', '语文': 75, '数学': 90, '英语': 91}]

# $.score[0] 表示根键下的第一个score中的语文的值,下面两种写法都可以
print(jsonpath.jsonpath(a, "$.score[0].语文"))
print(jsonpath.jsonpath(a, "$.[score][0]['语文']"))
# [75]

# $.score[1,3],表示根键下的第2个和第4个score键,一次性取多个数组下标的值
print(jsonpath.jsonpath(a, "$.score[1,3]"))
# [{'name': '李四', '语文': 78, '数学': 95, '英语': 90}, {'name': '王六', '语文': 90, '数学': 95, '英语': 90}]

# $.score[1:3],表示根键下的第2个和第3个score键,使用切片取值,注意区别于 $.score[1,4],二者得到的结果不一样
print(jsonpath.jsonpath(a, "$.score[1:3]"))
# [{'name': '李四', '语文': 78, '数学': 95, '英语': 90}, {'name': '王五', '语文': 90, '数学': 95, '英语': 90}]

# $.score[0:3:2],表示根键下的从第0个score键开始、到第4个score键结束(不包括)、每2个取1个,即取的是第0和第2个score键
print(jsonpath.jsonpath(a, "$.score[0:3:2]"))
# [{'name': '张三', '语文': 75, '数学': 90, '英语': 91}, {'name': '王五', '语文': 90, '数学': 95, '英语': 90}]

# 条件筛选:?()为应用条件筛选器,@表示当前键,一般结合使用?(@ )
# 取name为 ’张三‘ 的 ’数学‘成绩
print(jsonpath.jsonpath(a, "$.score[?(@.name=='张三')].'数学'"))
# [90]

# 取成绩中有 extra 键的数据,如果key为中文 $.score[?(@.'数学')],则筛选表达式返回结果会为 False ,哪位大神知道是为什么?可以评论区告诉我一下答案
print(jsonpath.jsonpath(a, "$.score[?(@.extra)]"))
# [{'name': '王六', '语文': 90, '数学': 95, '英语': 90, 'extra': 80}, {'name': '老李', '语文': 90, '数学': 95, '英语': 90, 'extra': 90}]

# 取成绩中有 extra 分数大于85的数据
print(jsonpath.jsonpath(a, "$.score[?(@.extra>85)]"))
# [{'name': '老李', '语文': 90, '数学': 95, '英语': 90, 'extra': 90}]

# 递归取值,获取所有键为 extra 的值
print(jsonpath.jsonpath(a, "$..extra"))
# [80, 90]

# * 表示所有 $.* 表示获取根键下所有的值
print(jsonpath.jsonpath(a, "$.*"))
# [[{'name': '张三', '语文': 75, '数学': 90, '英语': 91}, {'name': '李四', '语文': 78, '数学': 95, '英语': 90}, {'name': '王五', '语文': 90, '数学': 95, '英语': 90}, {'name': '王六', '语文': 90, '数学': 95, '英语': 90, 'extra': 80}, {'name': '老李', '语文': 90, '数学': 95, '英语': 90, 'extra': 90}], '社会大学']

# 加上参数 result_type='IPATH' 可以返回键名
print(jsonpath.jsonpath(a, "$.*", result_type='IPATH'))
# [['score'], ['school']]

# 加上参数 debug=1 开启调试模式,默认为 debug=0 关闭
print(jsonpath.jsonpath(a, "$.*", debug=1))
# trace * / $
# 	 * <class 'dict'>
# trace score; / $
# 	 score <class 'dict'>
# trace  / $;score
# trace school; / $
# 	 school <class 'dict'>
# trace  / $;school
# [[{'name': '张三', '语文': 75, '数学': 90, '英语': 91}, {'name': '李四', '语文': 78, '数学': 95, '英语': 90}, {'name': '王五', '语文': 90, '数学': 95, '英语': 90}, {'name': '王六', '语文': 90, '数学': 95, '英语': 90, 'extra': 80}, {'name': '老李', '语文': 90, '数学': 95, '英语': 90, 'extra': 90}], '社会大学']

Je suppose que tu aimes

Origine blog.csdn.net/m0_54701273/article/details/128385056
conseillé
Classement