无法将字节转换为JSON

时间:2019-09-18 09:50:40

标签: 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'}]\"",
...

我在views.py中进行处理,试图将数据转换成字典:

sh_list = json.loads(serializer.data["sh_list"])

print('sh_list:', sh_list)
# sh_list: [{'position': 1, 'item': 'Display'}, {'position': 3, 'item': 'Keyboard'}, {'position': 4, 'item': 'Headphones'}]
print('sh_list type:', type(sh_list))
# sh_list type: <class 'str'>

print('serializer.data["sh_list"] type:', type(serializer.data["sh_list"]))
# serializer.data["sh_list"] type: <class 'bytes'>

sh_list2 = serializer.data["sh_list"].decode()
print('sh_list2:', sh_list2)
# sh_list2: "[{'position': 1, 'item': 'Display'}, {'position': 3, 'item': 'Keyboard'}, {'position': 4, 'item': 'Headphones'}]"
print('sh_list2 type:', type(sh_list2))
# sh_list2 type: <class 'str'>

sh_list3 = json.loads(sh_list2)
print('sh_list3[0]:', sh_list3[0])
# sh_list3[0]: [
print('sh_list3 type:', type(sh_list3))
# sh_list3 type: <class 'str'>

所需的输出对我来说像是

print('sh_list3[0]:', sh_list3[0])
# sh_list3[0]: {'position': 1, 'item': 'Display'}

如何进行从字节到字典的转换?

1 个答案:

答案 0 :(得分:2)

sh_list = json.loads(serializer.data["sh_list"]) 

返回字典。

一个键“ 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])

但这绝对不是健壮的代码。 如果可能的话,我建议从源头上解决问题,并更改生成这些“有趣”字符串的代码