处理json

Posted 羽竹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了处理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串了

 









以上是关于处理json的主要内容,如果未能解决你的问题,请参考以下文章

Spark处理json数据

如何递归处理 JSON 数据并从函数返回处理后的 JSON?

Springmvc处理post+json数据

Hive处理Json数据

jmeter——后置处理器_JSON提取器

MVC中处理Json和JS中处理Json对象