在 Python 中, JSON 数据和字符串的转换可以使用 JSON 模块或 simplejson 模块.
JSON 从 Python2.6 开始内置到了 Python 标准库中, 我们不需要安装即可直接使用.
simplejson 需要安装后才可以使用.
一, 安装 simplejson
pip install simplejson
二, 使用 JSON 和 simplejson 将 JSON 格式的数据转换成字符串
- import JSON
- import simplejson
- list_json = [{
- 'a': 'bbb'
- }, {
- 'c': 'ddd'
- }, {
- 'e': 'fff'
- }]
- print(type(list_json))
- json_str = JSON.dumps(list_json, ensure_ascii=False)
- print(json_str)
- print(type(json_str))
- simplejson_str = simplejson.dumps(list_json, ensure_ascii=False)
- print(simplejson_str)
- print(type(simplejson_str))
运行结果:
- [{
- "a": "bbb"
- }, {
- "c": "ddd"
- }, {
- "e": "fff"
- }]
- [{
- "a": "bbb"
- }, {
- "c": "ddd"
- }, {
- "e": "fff"
- }]
JSON 和 simplejson 都提供了 dump()和 dumps(),dump 是用于将内容转 JSON 字符串后写入文件中, dumps 是将 JSON 格式的数据 (字典或字典组成的列表) 转换成 JSON 字符串.
在 dumps 对数据进行处理时, 会做 encoding(编码)操作, dumps()中的 ensure_ascii 默认是为 True 的, 会将中文也编码成 ascii, 所以我们指定 ensure_ascii=False.
三, 使用 JSON 和 simplejson 将 JSON 字符串转换成其他数据
- json_list = JSON.loads(json_str, encoding='utf-8', strict=False)
- print(json_list)
- print(type(json_list))
- simplejson_list = simplejson.loads(simplejson_str, encoding='utf-8', strict=False)
- print(simplejson_list)
- print(type(simplejson_list))
运行结果: 无锡人流多少钱 http://www.bhnfkyy.com/
- [{
- 'a': 'bbb'
- }, {
- 'c': 'ddd'
- }, {
- 'e': 'fff'
- }]
- [{
- 'a': 'bbb'
- }, {
- 'c': 'ddd'
- }, {
- 'e': 'fff'
- }]
JSON 和 simplejson 都提供了 load()和 loads(),load 与 dump 对应, 是用于从文件中读取 JSON 字符串然后进行转换的, loads 是将 JSON 字符串直接转换成 Python 数据类型.
在使用 loads 对 JSON 字符串进行转换时, 有时候可能因为 JSON 字符串的格式不是完全的符合 JSON 格式, 会造成 loads 报错, 这时候我们可以设置参数 strict=False, 表示 loads()时, 不严格检查 JSON 格式.
Bug 描述:
在使用 JSON.loads()将 JSON 字符串转换成 JSON 数据时, 报错信息: Expecting ',' delimiter line l column .. (char ..), 还遇到过这种报错: Expecting ',' delimiter or '}': line l column .. (char ..)
这都是因为 JSON 字符串的样式不是合法的 JSON 格式, 一般这种情况是从数据库中读数据时或者从文件中读数据时会发生.
最常出现的就是数据里面有双引号 ", 并且双引号前没有反斜杠转义. 所以在使用 JSON.loads()时要先确认要 loads()的 JSON 字符串是否合法. 如果有双引号则要有反斜杠转义.
解决方法:
如果出现了上面的报错, 可以检查是否有不合法的字符, 如有双引号, 可以将双引号进行转义, 避免解析时将其识别为 JSON 的双引号造成双引号多了报错, 如果里面有带反斜杠 \ 的 url 链接, 可以将反斜杠 \ 替换成斜杠 /.
可以通过 re 正则进行匹配替换, 或者用字符串的 replace()方法替换.
来源: http://www.bubuko.com/infodetail-3095080.html