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

Mer*_*eur 44 python json

我想将一个字节数组转换为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\'}]'
Run Code Online (Sandbox Code Playgroud)

这是我想要的结果:

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

谢谢你的帮助

编辑:

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

my_new_string_value = my_bytes_value.decode("utf-8")
Run Code Online (Sandbox Code Playgroud)

但是当我尝试加载到JSON时:my_json = json.loads(my_new_string_value) 我收到此错误:json.decoder.JSONDecodeError:期望值:第1行第174列(char 173)

PM *_*ing 68

你的bytes对象几乎是JSON,但它使用单引号而不是双引号,它需要是一个字符串.所以你只需要解码它并替换引号.如果要打印它或将其作为有效的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)
Run Code Online (Sandbox Code Playgroud)

产量

[{"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
    }
]
Run Code Online (Sandbox Code Playgroud)

正如Antti Haapala在评论中提到的那样,一旦我们将其解码为字符串,我们就可以使用ast.literal_eval转换my_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)
Run Code Online (Sandbox Code Playgroud)

  • 我不认为这是JSON字符串,而是Python repr,所以请改用literal_eval (3认同)

小智 25

你可以简单地使用,

import json

json.loads(my_bytes_value)
Run Code Online (Sandbox Code Playgroud)

  • 这应该有绿色勾号。 (11认同)
  • 并不真地。这回答了标题中的问题,但忽略了OP提供的示例有单引号。在这种情况下,`json.loads(my_bytes_value)`会抛出`json.decoder.JSONDecodeError`。 (3认同)

小智 9

Python 3.5 +使用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))  
Run Code Online (Sandbox Code Playgroud)