Python-jsonpath使用和json转换

枫铃4年前 (2021-07-11)Python242

(一)JSONPath-JSON的XPath

  • JSONPath表达式始终以与XPath表达式与XML文档结合使用的相同方式引用JSON结构。由于JSON结构通常是匿名的,并且不一定具有“根成员对象”,因此JSONPath假定$分配给外部对象的抽象名称。[摘自官方文档]
  • JSONPath表达式可以使用点号-表示法:$.store.book[0].title
  • 括号符号:$[‘store’][‘book’][0][‘title’]
  • JSONPath允许通配符 *表示成员名称和数组索引

部分语法(够用)

jsonpath描述$根元素@当前对象元素.子元素…递归下降(所有元素)*通配符

安装jsonpath库

pip install jsonpath

准备json数据

json_data = {
    "code": 0,
    "message": "0",
    "ttl": 1,
    "data": {
        "isLogin": True,
        "email_verified": 0,
        "face": "http://i1.hdslb.com/bfs/face/17061e541785832b44426c51429ddfee39.jpg",
        "level_info": {
            "current_level": 0,
            "current_min": 0,
            "current_exp": 0,
            "next_exp": 1
        },
        "mid": 377206,
        "mobile_verified": 1,
        "money": 0,
        "moral": 70,
        "official": {
            "role": 0,
            "title": "",
            "desc": "",
            "type": -1
        },
        "officialVerify": {
            "type": -1,
            "desc": ""
        },
        "pendant": {
            "pid": 0,
            "name": "",
            "image": "",
            "expire": 0
        },
        "scores": 0,
        "uname": "洒脱喽",
        "vipDueDate": 0,
        "vipStatus": 0,
        "vipType": 0,
        "vip_pay_type": 0,
        "vip_theme_type": 0,
        "wallet": {
            "mid": 377206,
            "bcoin_balance": 0,
            "coupon_balance": 0,
            "coupon_due_time": 0
        },
        "has_shop": False,
        "shop_url": "",
        "allowance_count": 0,
        "answer_status": 1
    }
}

导包

import jsonpath

使用

1、获取data节点下的所有数据

普通取值方式

datas = json_data["data"]
for data in datas.items():
    print(data)

使用jsonpath取值

# 返回的是一个数组
datas = jsonpath.jsonpath(json_data, "$.data")
for data in datas[0].items():
    print(data)

在这里插入图片描述

2、获取json数据中的uname

# 普通取值需要先看json数据,找到uname节点,如果没有就会报错
data1 = json_data["data"]["uname"]
print(data1)
# jsonpath取值不需要看json数据,直接通过..(..就表示全局检索后面跟的属性)全局搜索uname属性,如果没有返回FALSE
data2 = jsonpath.jsonpath(json_data, "$..uname")
print(data2)

在这里插入图片描述
3、获取json数据中所有的mid(使用普通的取值只能一个一个获取)

datas = jsonpath.jsonpath(json_data, "$..mid")

在这里插入图片描述
(二)json转换

  • **不能使用dict将json字符串转换为字典
  • **不能使用eval将json字符串转换为字典,json中的null在python中无法识别,会当成变量处理
  • loads():将json字符串转换为python类型的,或自动将null转换为None
  • dumps():将python类型的数据转换为json字符串,会自动将None转换为null

json库是Python3自带的库,直接导入使用

import json

准备一个字典和一个json字符串#

data = {"name": "ming", "id": 18, "msg": None}
json_data = '{"name":"Tom","id":19,"msg":null}'

使用loads()将json字符串转换为python类型的,或自动将null转换为None#

res = json.loads(json_data)
print(res, type(res))

在这里插入图片描述
使用dumps()将python类型的数据转换为json字符串,会自动将None转换为null#

res = json.dumps(data)
print(res, type(res))

在这里插入图片描述

相关文章

利用python同步windows和linux文件

写python脚本的初衷,每次在windows编辑完文件后,想同步到linux上去,只能够登录服务器,...

爬虫基本原理

爬虫基本原理 一、爬虫是什么? 百度百科和维基百科对网络爬虫的定义:简单来说爬虫就是抓取目标网站内容的工具,一般是根据定义的行...

Django 函数和方法的区别

函数和方法的区别 1、函数要手动传self,方法不用传 2、如果是一个函数,用类名去调用,如果是一个方法...

Django 知识补漏单例模式

单例模式:(说白了就是)创建一个类的实例。在 Python 中,我们可以用多种方法来实现单例模式&#x...

Django基础知识MTV

Django简介 Django是使用Python编写的一个开源Web框架。可以用它来快速搭建一个高性能的网站。 Django也是一个MVC框架。但是在Dj...

Python mysql 索引原理与慢查询优化

一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。