programing

바이트 배열을 JSON 형식으로 변환합니다.

sourcejob 2023. 2. 23. 22:46
반응형

바이트 배열을 JSON 형식으로 변환합니다.

해석하고 싶다bytes문자열을 JSON 형식으로 지정하여 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")

하지만 내가 이 모든 걸 불러내려고 할 때loadsJSON으로 해석하려면:

my_json = json.loads(my_new_string_value)

다음의 에러가 표시됩니다.

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

당신의.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
    }
]

Anti Haapala가 댓글에 언급했듯이ast.literal_eval개종하다my_bytes_value문자열로 디코딩하면 파이썬 목록으로 이동합니다.

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)

일반적으로 이 문제는 누군가가 적절한 JSON 데이터를 생성하기 위해 모듈을 사용하는 대신 Python을 인쇄하여 데이터를 저장했기 때문에 발생합니다.가능하다면 우선 적절한 JSON 데이터가 생성되도록 문제를 수정하는 것이 좋습니다.

간단하게 사용할 수 있습니다.

import json

json.loads(my_bytes_value)

Python 3.5 + Use 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))  

이 바이트 배열을 직접 json으로 변환하려면 먼저 바이트 배열을 decode()를 사용하여 문자열로 변환합니다. utf-8이 표준입니다.따옴표 변경..마지막 단계는 덤프된 문자열에서 "를 제거하고 json 개체를 문자열에서 목록으로 변경하는 것입니다.

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

보다 나은 솔루션은 다음과 같습니다.

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에 의한 디코딩에서는 유니코드 문자를 디코딩할 수 없습니다.올바른 솔루션은 uicode_escape입니다.

그것은 괜찮아

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

bytes 객체가 있고 이를 JSON 파일에 저장하려면 먼저 바이트 객체를 디코딩해야 합니다. 왜냐하면 JSON은 데이터 유형이 몇 개뿐이고 원시 바이트 데이터는 그 중 하나가 아니기 때문입니다.여기에는 배열, 10진수, 문자열 및 개체가 있습니다.

바이트 개체를 디코딩하려면 먼저 인코딩을 알아야 합니다.이를 위해

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)

가장 간단한 해결방법은jsonhttp 요구와 함께 제공되는 함수입니다.

예를 들어 다음과 같습니다.

json 함수의 사용 예

언급URL : https://stackoverflow.com/questions/40059654/convert-a-bytes-array-into-json-format

반응형