Gzip в base64 кодирование добавляет символы в строку JSON - PullRequest
2 голосов
/ 18 июня 2019

У меня есть вложенный словарь python, который сериализован в строку json, которую я затем преобразую в сжатый файл Gzip и кодирую его в base64.Однако, как только я преобразую его обратно в строку JSON, он добавляет \\ к строке, которой нет в исходной строке JSON до преобразования.Это происходит на каждом из вложенных уровней словаря.Это функции:

import json
import io
import gzip
import base64
import zlib

class numpy_encoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, np.integer):
            return int(obj)
        elif isinstance(obj, np.floating):
            return float(obj)
        elif isinstance(obj, np.ndarray):
            return obj.tolist()
        else:
            return super(numpy_encoder, self).default(obj)


def dict_json_dump(dictionary):
    dumped = json.dumps(dictionary, cls = numpy_encoder, separators=(",", ":"))
    return dumped

def gzip_json_encoder(json_string):
    stream = io.BytesIO()
    with gzip.open(filename=stream, mode='wt') as zipfile:
        json.dump(json_string, zipfile)
    return stream

def base64_encoder(gzip_string):
    return base64.b64encode(gzip_string.getvalue())

Мы можем использовать функции следующим образом:

json_dict = pe.dict_json_dump(test_dictionary)
gzip_json = pe.gzip_json_encoder(json_dict)
base64_gzip = pe.base64_encoder(gzip_json)

Когда я проверяю base64_gzip с помощью следующей функции:

json_str = zlib.decompress(base64.b64decode(base64_gzip), 16 + zlib.MAX_WBITS)

Я получаю строку JSON обратно в таком формате (усеченном):

b'"{\\"trainingResults\\":{\\"confusionMatrix\\":{\\"tn\\":2,\\"fn\\":1,\\"tp\\":1,\\"fp\\":1},\\"auc\\":{\\"score\\":0.5,\\"tpr\\":[0.0,0.5,0.5,1.0],\\"fpr\\":[0.0,0.333,0.667,1.0]},\\"f1\\"

Это не полная строка, но содержимое самой строки является точным.То, в чем я не уверен, так это то, почему обратные слэши появляются, когда я конвертирую их обратно.У кого-нибудь есть предложения?Я попробовал кодировку utf-8 на моем JSON, но безуспешно.Любая помощь приветствуется!

1 Ответ

3 голосов
/ 18 июня 2019

Вы выполняете кодировку JSON дважды: один раз в dict_json_dump() и снова в gzip_json_encoder().Поскольку json_string уже закодирован, вам не нужно вызывать json.dump() в gzip_json_encoder().

def gzip_json_encoder(json_string):
    stream = io.BytesIO()
    with gzip.open(filename=stream, mode='wt') as zipfile:
        zipfile.write(json_string)
    return stream
...