zoukankan      html  css  js  c++  java
  • Python3之jsonpath使用和json转换

    jsonpath使用和json转换

    (一)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))
    

    【完】

  • 相关阅读:
    BZOJ 1834 Luogu P2604 [ZJOI2010]网络扩容 (最小费用最大流)
    BZOJ 1565 Luogu P2805 [NOI2009]植物大战僵尸 (Tarjan判环、最小割)
    BZOJ 3993 Luogu P3324 [SDOI2015]星际战争 (最大流、二分答案)
    BZOJ 3277 串 & BZOJ 3473 字符串 (广义后缀自动机、时间复杂度分析)
    BZOJ 2806 Luogu P4022 [CTSC2012]Cheat (广义后缀自动机、DP、二分、单调队列)
    Mongodb的聚合和管道
    Mongodb文档查询
    Mongodb的基本操作-数据库 集合 文档的增删改查
    Linux下Mongodb的安装
    mongdb的优势和不足
  • 原文地址:https://www.cnblogs.com/desireyang/p/12106118.html
Copyright © 2011-2022 走看看