今天在处理 JSON 数据的时候遇到了一个意想不到的问题,不过也算是个小问题吧,记录一下解决方案,同时提醒自己下次不要犯同样的错误了。
目录
一、json
(一)json.loads
(二)json.dumps
二、问题
三、解决方法
一、json使用 Python 处理 JSON 数据还是非常简单的,常用的命令有两个:
json.loads:用于解码 JSON 数据。该函数返回 Python 字段的数据类型 json.dumps:用于将 Python 对象编码成 JSON 字符串 (一)json.loads用于解码 JSON 数据。该函数返回 Python 字段的数据类型,最常使用的代码如下:
import json
jsonData = '{"a":1,"b":2,"c":3,"d":4,"e":5}'
data = json.loads(jsonData)
print(type(data))
print(data)
运行结果:
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
简单来说,就是把一段 JSON 字符串解析为 Python 的 dict 。
(二)json.dumps
用于将 Python 对象编码成 JSON 字符串,最常使用的代码如下:
import json
data = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
jsonData = json.dumps(data)
print(type(jsonData))
print(jsonData)
运行结果:
{"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}
简单来说,就是把一段 Python 的 dict 解析为 JSON 字符串 。
这里,我们可以使用参数让 JSON 数据格式化输出,修改的代码如下:
jsonData = json.dumps(data, sort_keys=True, indent=4, separators=(',', ': '))
运行结果:
{
"a": 1,
"b": 2,
"c": 3,
"d": 4,
"e": 5
}
二、问题
“Expecting property name enclosed in double quotes: line 1 column 2 (char 1)”翻译为“要求属性名用双引号括起来:第1行第2列(字符1)”。这个问题的出现是因为在把一段 Python 的 dict 解析为 JSON 字符串时,没有使用上述的 json.dumps 方法,而是使用 str 方法强制将其解析为 JSON 字符串,代码如下:
data = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
jsonData = str(data)
print(type(jsonData))
print(jsonData)
运行结果:
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
可以看到这种运行方式与使用 json.dumps 方法的运行结果十分相似,但是当我们重新将该输出结果 jsonData 解析为 Python 的 dict 时,问题就出现了,代码如下:
import json
data = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
jsonData = str(data)
text = json.loads(jsonData)
print(type(text))
print(text)
运行结果:
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
三、解决方法
demjson 是 Python 的第三方模块库,可用于编码和解码JSON 数据,包含了 JSONLint 的格式化及校验功能,可以有效处理上述问题。
常用的命令有两个:
demjson.encode:将 Python 对象编码成 JSON 字符串
demjson.decode:将已编码的 JSON 字符串解码为 Python 对象
具体使用方法与 json.loads 和 json.dumps 相似,就不过多阐述了。
作者:Ambitioner_c