Python Can';t将字节转换为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'}]\

序列化程序类确保写入数据库的数据为JSON格式:

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对象的名称添加了双引号。真奇怪。