zoukankan      html  css  js  c++  java
  • day4_处理json

    说明:
    #json是一种通用的数据类型,所有的语言都认识。
    #k - v {}
    #json串就是一个字符串,不能根据key-value取值
    #json可以转成字典
    #json串就是字符串,可放在三引号中
    校验json格式的网址:http://www.bejson.com/
    那么json怎么转成字典,用到模块json,可以import json

    一、JSON 函数

    1、json.dumps:字典转成json串(字符串)

    json.dumps(stus,indent=8,ensure_ascii=False) #将字典转成json字符串 ;indent 控制几个缩进的;当字典中有中文的时候,需要写ensure_ascii=False,不然json串里面不显示汉字。

    2、json.loads:将json串转成字典

    1)字典和json互相转换:

    import json  #导入json模块
    s = '''                      
    {
            "error_code": 0,
            "stu_info": [
                    {
                            "id": 309,
                            "name": "小白",
                            "sex": "男",
                            "age": 28,
                            "addr": "河南省济源市北海大道32号",
                            "grade": "天蝎座",
                            "phone": "18512572946",
                            "gold": 100
                    },
                    {
                            "id": 310,
                            "name": "小白",
                            "sex": "男",
                            "age": 28,
                            "addr": "河南省济源市北海大道32号",
                            "grade": "天蝎座",
                            "phone": "18516572946",
                            "gold": 100
                    }
            ]
    }
    '''
    res = json.loads(s)   #将json串转成字典
    print(res)
    print(type(res))
    stus = {'xiaojun':'123456','xiaohei':'345346'}  #一个字典
    res2 = json.dumps(stus)  #将字典转成json串
    print(res2)
    print(type(res2))

    2)字典转成json串,然后写入文件

    stus = {'xiaojun':'123456','xiaohei':'345346','海龙':'34535'}  #一个字典
    res2 = json.dumps(stus,indent=8,ensure_ascii=False)  #将字典转成json串
    print(res2)
    print(type(res2))
    with open('stus.json','w',encoding='utf-8') as f:   #文件的后缀.json,这样文件里面显示的好看,有颜色区分。后缀无所谓
        f.write(res2)

    文件中看-实际带有颜色:

    {
            "xiaohei": "345346",
            "海龙": "34535",
            "xiaojun": "123456"
    }

     3)从文件中读取json串,转成字典

    with open('stus.json','r',encoding='utf-8')as f:
        content = f.read()        #返回字符串
        user_dict = json.loads(content)      #将json字符串转成字典
    print(user_dict)

     3、json.load()与json.loads()的区别

    两个方法功能类似,可选参数也相同,最大的区别在于,json.load方法接受的输入,即第一个参数,是包含json数据的文件对象,如open方法的返回对象。

    json.loads接受的输入是json字符串,而非文件对象。

    如果说你要操作文件,可以直接用json.load

    举例:

    json.loads()将文件中的json转成字典如下:

    with open('stus.json','r',encoding='utf-8')as f:
        content = f.read()        #返回字符串
        user_dict = json.loads(content)      #json.loads接受的是字符串content
    print(user_dict)

    json.load()将文件中的json转成字典如下:

    with open('stus.json','r',encoding='utf-8')as f:
        user_dic = json.load(f)   #json.load接受的是文件对象
        print(user_dic)

    4、json.dump()和json.dumps()区别

    dump()第一个参数时字典对象,第二个参数是文件对象,可以直接将转换后的json数据写入文件;dumps的第一个参数是对象字典,其余都是可选参数。

    参数记录如下:

    ensure_ascii 默认为True,保证转换后的json字符串中全部是ascii字符,非ascii字符都会被转义。如果数据中存在中文或其他非ascii字符,最好将ensure_ascii设置为False,保证输出结果正常。

    indent 缩进,默认为None,没有缩进,设置为正整数时,输出的格式将按照indent指定的半角空格数缩进,相当实用。

    separators 设置分隔符,默认的分隔符是(',', ': '),如果需要自定义json中的分隔符,例如调整冒号前后的空格数,可以按照(item_separator, key_separator)的形式设置。

    sort_keys 默认为False,设为True时,输出结果将按照字典中的key排序。

    将字典转成json串写入文件操作:

    json.dumps()方式

    stus = {'xiaojun':'123456','xiaohei':'345346','海龙':'34535'}
    f = open('stus.json','w',encoding='utf-8')
    res = json.dumps(stus,indent=8,ensure_ascii=False)  #转换成json串
    f.write(res)   #写入文件

    json.dump()方式:

    stus = {'xiaojun':'123456','xiaohei':'345346','海龙':'34535'}
    f = open('stus.json','w',encoding='utf-8')
    json.dump(stus,f,indent=8,ensure_ascii=False)  #json.dump第一个参数字典(stus),第二个参数文件对象(f),这个不需要再写入操作了,直接就写进去了

    以上:当你要把字典写到文件里面,用dump比较好用。如果你不操作文件,想存到数据库里面,不能用dump,还得用dumps.

    不带s都跟文件相关,带s的都跟字符串相关。

    问题:应用json.load/loads/dump/dumps方法时,文件中的内容如果不是json格式会抛异常如下。

    raise JSONDecodeError("Expecting value", s, err.value) from None
    json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

    原因:文件中不是json格式,可用http://www.bejson.com/查询是不是json格式,其中:文件是空的不是json格式,1也是json格式,{}是json格式

    如果起初文件就是空的,可以写个{}这样就能正确解析json串了

     

  • 相关阅读:
    洛谷P2158 [SDOI2008]仪仗队 欧拉函数的应用
    leetcode 130. 被围绕的区域 DFS
    TediousLee CodeForces
    AccurateLee双指针+贪心+字符串
    leetcode80. 删除排序数组中的重复项 II
    CHFDORA:哆啦 A 梦
    cdq分治浅谈
    leetcode面试题64. 求1+2+…+n
    leetcode84. 柱状图中最大的矩形
    leetcode874. 模拟行走机器人
  • 原文地址:https://www.cnblogs.com/once-again/p/9576648.html
Copyright © 2011-2022 走看看