Python Can';t将字节转换为JSON
序列化程序类确保写入数据库的数据为JSON格式:Python Can';t将字节转换为JSON,python,python-3.x,dictionary,django-rest-framework,Python,Python 3.x,Dictionary,Django Rest Framework,序列化程序类确保写入数据库的数据为JSON格式: sh_list=serializers.JSONField(binary=True) 数据作为输出JSON中的一个条目可见: ... "sh_list": "\"[{'position': 1, 'item': 'Display'}, {'position': 3, 'item': 'Keyboard'}, {'position': 4, 'item': 'Headphones'}]\
sh_list=serializers.JSONField(binary=True)
数据作为输出JSON中的一个条目可见:
...
"sh_list": "\"[{'position': 1, 'item': 'Display'},
{'position': 3, 'item': 'Keyboard'},
{'position': 4, 'item': 'Headphones'}]\"",
...
我在views.py中处理它,试图将数据转换成字典:
sh_list=json.load(serializer.data[“sh_list”])
打印('SHU列表:',SHU列表)
#sh_列表:[{'position':1,'item':'Display'},{'position':3,'item':'Keyboard'},{'position':4,'item':'Headspes'}]
打印('sh_列表类型:',类型(sh_列表))
#sh_列表类型:
打印('serializer.data[“sh_list”]类型:',类型(serializer.data[“sh_list”]))
#序列化程序.数据[“sh_列表”]类型:
sh_list2=serializer.data[“sh_list”].decode()
打印('sh_list2:',sh_list2)
#sh_列表2:[{'position':1,'item':'Display'},{'position':3,'item':'Keyboard'},{'position':4,'item':'Headspes'}]
打印('sh_列表2类型:',类型(sh_列表2))
#sh_列表2类型:
sh_list3=json.loads(sh_list2)
打印('sh_list3[0]:',sh_list3[0])
#sh_列表3[0]:[
打印('sh_列表3类型:',类型(sh_列表3))
#sh_列表3类型:
对我来说,所需的输出是:
print('sh_list3[0]:',sh_list3[0])
#sh_list3[0]:{'position':1,'item':'Display'}
如何继续从字节到字典的转换
sh_list = json.loads(serializer.data["sh_list"])
返回一个dict
使用一个键“sh_list”和一个字符串作为值
这个字符串就是问题所在,创建它的代码可能有缺陷,或者不打算返回可以解析为json字符串的数据
首先是字符串
"\"[{'position': 1, 'item': 'Display'},
{'position': 3, 'item': 'Keyboard'},
{'position': 4, 'item': 'Headphones'}]\"
包含前导双引号和尾随双引号。
但即使去掉这些,内容也包含单引号而不是双引号。Json需要双引号
因此,您可以使用
fixed_json = sh_list[1:-1].replace("'", '"')
aslist = json.load(fixed_json)
print(repr(aslist[0])
但这绝对不是健壮的代码。
如果可能的话,我建议在源代码处修复该问题,并更改生成这些“有趣”字符串的代码由于“
字符,我得到了一个jsondecoderror
。但是,这解决了它:sh_list2=sh_list2.replace(“,”)
。感谢您指出这一点。似乎,序列化程序。JSONField
将JSON转换为单引号形式。标准文本字段
不会这样做。我将检查编码器,可能会应用这些帮助之一。这几乎就像分层序列化程序创建字符串版本(repr)python对象的名称添加了双引号。真奇怪。