«Ошибка типа: объект байтов типа не поддерживает сериализацию в формате JSON» - PullRequest
1 голос
/ 22 мая 2019

Попытка выгрузить словарь в файл JSON выдает ошибку «TypeError: требуется объект, похожий на байты, а не 'str'"

Я уже пытался удалить часть преобразования байтов функции "encrypt_string", но она выдает мне ошибку "TypeError: требуется объект, похожий на байты, а не 'str'"

#!/usr/bin/python3

# Imports
import json
import base64
from cryptography.fernet import Fernet

# Save
def encrypt_string(string, f):
    return str(f.encrypt(base64.b64encode(bytes(string,'utf-8'))).decode('utf-8'))

def encrypt_dict(dict):
    fk = Fernet.generate_key().decode('utf-8')
    f = Fernet(fk)
    ed = {}
    ed['fk'] = base64.b64encode(bytes(fk, 'utf-8'))
    for key, value in dict.items():
        ekey = encrypt_string(key, f)
        evalue = encrypt_string(value, f)
        ed[ekey[::-1]] = evalue[::-1]
    return ed

def save_game(slot, savename):
    print("Saving file...")
    path = 'saves/savegame{0}.json'.format(slot)
    data = {
        'game': 'Game name here',
        'version': 'Version here',
        'author': 'Author here',
        'savename': str(savename),
    }
    data = encrypt_dict(data)
    with open(path, 'w') as f:
        json.dump(data, f)
        f.close()
    print('Data saved in', path)

# Main
import gamemodule as gm

def main():
    print("Running...")
    gm.save_game(1, 'test')
    input("Press any button to continue...")

Я ожидал, что файл программы сохранит данные игры, но он просто возвращает «TypeError: требуется байтоподобный объект, а не« str »»

Я думаю, что это связано со мной, кодирующим переменные в функции encrypt_dict, но я не уверен, я просматривал другие проблемы, подобные этой, но не нашел ничего, что исправило бы мою ошибку

1 Ответ

0 голосов
/ 23 мая 2019

Проблема в том, что base64.b64encode(bytes(fk, 'utf-8')) в encrypt_dict возвращает байтовую строку (b'NGtUbnNEc2hXZTlsOE1tcWVoVkNOUjMtWVIxcVZrWGV1WlBVcjJ2WkhHST0='), а encrypt_string возвращает нормальную строку (без начального b).Формат JSON поддерживает только строки Unicode.

Это можно исправить, заменив строку 16 в encrypt_dict на

ed['fk'] = base64.b64encode(bytes(fk, 'utf-8')).decode("ascii")
...