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

Posted

技术标签:

【中文标题】Python - 将字节数组转换为 JSON 格式【英文标题】:Python - Convert a bytes array into JSON format 【发布时间】:2017-02-24 20:37:23 【问题描述】:

我想解析 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)

【问题讨论】:

第一件事。字节到字符串,然后字符串到 JSON 我已使用 .decode("utf-8") 将字节转换为字符串,但是当我尝试将字符串转换为 JOSN 时出现此错误 json.decoder.JSONDecodeError: Expecting value:line 1 column 174 (char 173) 你能用相关代码更新你的问题并打印出解码后的字符串吗? 还有,你从哪里得到这个 json? @MerouaneBenthameur 失败的原因是您拥有的字符串不是 JSON。最明显的是JSON使用",而不是' 【参考方案1】:

Python 3.5 + 使用io module

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))  

【讨论】:

谢谢!这是最不讨厌和最直接的路径,特别是如果字节数组中的 json 已经正确格式化。【参考方案2】:

你可以简单地使用,

import json

json.loads(my_bytes_value)

【讨论】:

这应该有绿色勾号。【参考方案3】:

您的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 在 cmets 中提到的,我们可以使用 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 数据。

【讨论】:

我不相信它是一个 JSON 字符串,而是一个 Python repr,所以改用literal_eval 顺便说一句,如果你想分析或遍历一个复杂的 JSON 结构请看***.com/a/52414034/4014959 & ***.com/a/41778581/4014959【参考方案4】:

要将此字节数组直接转换为 json,您可以先使用 decode() 将字节数组转换为字符串,utf-8 是标准的。更改引号。最后一步是从转储的字符串中删除“,将json对象从字符串更改为列表。

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

【讨论】:

以上是关于Python - 将字节数组转换为 JSON 格式的主要内容,如果未能解决你的问题,请参考以下文章

将 json 对象数组转换为 tsv (python)

将表示 UCHAR 数组的 json 字符串响应转换为字节数组

使用 Fuel 和 Result 将字节数组转换为 Json

将字节数组转换为字符串时的格式更改

将NV21字节数组转换为位图可读格式[重复]

将BuffereImage转换为JPEG格式的字节数组