将字节数组转换为 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)
327258 次浏览

要将这个 bytesarray 直接转换为 json,您可以首先使用 decode ()将 bytesarray 转换为一个字符串,utf-8是标准的。更改引号标记。.最后一步是从转储的字符串中删除“ ,将 json 对象从 string 更改为 list。

dumps(s.decode()).replace("'", '"')[1:-1]

您的 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 在注释中提到的,一旦我们将 my_bytes_value解码为字符串,就可以使用 ast.literal_eval将其转换为 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 数据。

你可以简单地使用,

import json


json.loads(my_bytes_value)

Python 3.5 + Use < a href = “ https://docs.Python.org/3/library/io.html”rel = “ noReferrer”> io 模块

import json
import io


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\'}]'


fix_bytes_value = my_bytes_value.replace(b"'", b'"')


my_json = json.load(io.BytesIO(fix_bytes_value))

更好的解决办法是:

import json
byte_array_example = b'{"text": "\u0627\u06CC\u0646 \u06CC\u06A9 \u0645\u062A\u0646 \u062A\u0633\u062A\u06CC \u0641\u0627\u0631\u0633\u06CC \u0627\u0633\u062A."}'
res = json.loads(byte_array_example.decode('unicode_escape'))
print(res)

结果:

{'text': 'این یک متن تستی فارسی است.'}

用 utf-8解码不能解码 Unicode 字符。正确的解决方案是 逃避

没关系

d = json.dumps(byte_str.decode('utf-8'))

如果您有一个 byte 对象并希望将其存储在 JSON 文件中,那么首先应该对 byte 对象进行解码,因为 JSON 只有几种数据类型,而原始字节数据不在其中。它有数组、十进制数、字符串和对象。

要解码一个字节对象,您首先必须知道它的编码

import chardet
encoding = chardet.detect(your_byte_object)['encoding']

然后您可以像下面这样将这个对象保存到您的 json 文件中

data = {"data": your_byte_object.decode(encoding)}
with open('request.txt', 'w') as file:
json.dump(data, file)

最简单的解决方案是使用 http 请求附带的 json函数。

例如:

An example of use the json function