1、json中的引号必须使用双引号
(在mysql中双引号和单引号可以互换,但不可混合使用,需成对出现。)
mysql支持存储json格式数据,但是写入时json内容中引号必须使用双引号,否则出现下述错误:
pymysql.err.OperationalError: (3140, ‘Invalid JSON text: “Missing a name for object member.” at position 1 in value for column ‘reviews_2020_copy1.s_index_test’.’)
因此在Python中将dict类型的数据嵌入到SQL中,在mysql中存储为json时,加入判断并使用json模块转化:
if isinstance(value,dict):
value=json.dumps(value)
在mysql中直接写SQL,值为json:
UPDATE table_name
SET column1='{"s_index":123456789}' #单双引号互换位置则会报错
2、json中的null值
Python生成带有null值的json:Python中的None等价于json中的null。
>>> dic={'name':'a','age':None}
>>> json.dumps(dic)
'{"name": "a", "age": null}'
3、json.dumps() 与 json.dump(); json.loads() 与 json.load()
json.dumps():将字典转换为json字符串
json.loads():将json字符串转化为字典
json.dump():将字典以json字符串形式写入json文件
json.load() :将json文件以dict形式读取
json.dump()示例:
f_t=open('data/CharData.json','w',encoding='utf-8')
json.dump(dic_all, f_t, cls=NpEncoder,ensure_ascii=False,indent=4)
代码部分参数解释:
1、解决中文写入json文件编码问题:
open()使用encoding=‘utf-8’
dump()使用ensure_ascii=False
2、解决写入文件换行问题:
dump()使用indent=4 (数字也可以定义其他值)
3、解决TypeError: Object of type int64 is not JSON serializable:
原因:json不识别int64数据类型(numpy、DataFrame中数据类型)
解决:
1)自定义数据转换类NpEncoder
2)dump()使用cls=NpEncoder
class NpEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, np.integer):
return int(obj)
elif isinstance(obj, np.floating):
return float(obj)
elif isinstance(obj, np.ndarray):
return obj.tolist()
else:
return super(NpEncoder, self).default(obj)