Python - 将字节数组转换为 JSON 格式

新手上路,请多包涵

我想解析一个 JSON 格式的 bytes 字符串以将其转换为 python 对象。这是我的来源:

 my_bytes_value = b'[{\'Date\': \'2016-05-21T21:35:40Z\', \'CreationDate\': \'2012-05-05\', \'LogoType\': \'png\', \'Ref\': 164611595, \'Classe\': [\'Email addresses\', \'Passwords\'],\'Link\':\'http://some_link.com\'}]'

这是我想要的预期结果:

 [{
"Date": "2016-05-21T21:35:40Z",
"CreationDate": "2012-05-05",
"LogoType": "png",
"Ref": 164611595,
"Classes": [
  "Email addresses",
  "Passwords"
],
"Link": "http://some_link.com"}]


首先,我将字节转换为字符串:

 my_new_string_value = my_bytes_value.decode("utf-8")

但是当我尝试调用 loads 将其解析为 JSON 时:

 my_json = json.loads(my_new_string_value)

我收到此错误:

 json.decoder.JSONDecodeError: Expecting value: line 1 column 174 (char 173)

原文由 Merouane Benthameur 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

您的 bytes 对象 几乎 是 JSON,但它使用单引号而不是双引号,并且它需要是一个字符串。所以解决它的一种方法是将 bytes 解码为 str 并替换引号。另一种选择是使用 ast.literal_eval ;详情见下文。如果您想打印结果或将其作为有效 JSON 保存到文件中,您可以将 JSON 加载到 Python 列表中,然后将其转储。例如,

 import json

my_bytes_value = b'[{\'Date\': \'2016-05-21T21:35:40Z\', \'CreationDate\': \'2012-05-05\', \'LogoType\': \'png\', \'Ref\': 164611595, \'Classe\': [\'Email addresses\', \'Passwords\'],\'Link\':\'http://some_link.com\'}]'

# Decode UTF-8 bytes to Unicode, and convert single quotes
# to double quotes to make it valid JSON
my_json = my_bytes_value.decode('utf8').replace("'", '"')
print(my_json)
print('- ' * 20)

# Load the JSON to a Python list & dump it back out as formatted JSON
data = json.loads(my_json)
s = json.dumps(data, indent=4, sort_keys=True)
print(s)

输出

[{"Date": "2016-05-21T21:35:40Z", "CreationDate": "2012-05-05", "LogoType": "png", "Ref": 164611595, "Classe": ["Email addresses", "Passwords"],"Link":"http://some_link.com"}]
- - - - - - - - - - - - - - - - - - - -
[
    {
        "Classe": [
            "Email addresses",
            "Passwords"
        ],
        "CreationDate": "2012-05-05",
        "Date": "2016-05-21T21:35:40Z",
        "Link": "http://some_link.com",
        "LogoType": "png",
        "Ref": 164611595
    }
]


正如 Antti Haapala 在评论中提到的那样,一旦我们将其解码为字符串,我们就可以使用 ast.literal_evalmy_bytes_value 转换为 Python 列表。

 from ast import literal_eval
import json

my_bytes_value = b'[{\'Date\': \'2016-05-21T21:35:40Z\', \'CreationDate\': \'2012-05-05\', \'LogoType\': \'png\', \'Ref\': 164611595, \'Classe\': [\'Email addresses\', \'Passwords\'],\'Link\':\'http://some_link.com\'}]'

data = literal_eval(my_bytes_value.decode('utf8'))
print(data)
print('- ' * 20)

s = json.dumps(data, indent=4, sort_keys=True)
print(s)


通常,出现此问题是因为有人通过打印其 Python repr 而不是使用 json 模块来创建正确的 JSON 数据来保存数据。如果可能,最好解决该问题,以便首先创建正确的 JSON 数据。

原文由 PM 2Ring 发布,翻译遵循 CC BY-SA 4.0 许可协议

你可以简单地使用,

 import json

json.loads(my_bytes_value)

原文由 Chaithanya Krishna 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题