Gzip到base64编码将字符添加到JSON字符串

时间:2019-06-17 21:25:17

标签: python json python-3.x base64 gzip

我有一个嵌套的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\\"

这不是完整的字符串,但是字符串本身的内容是准确的。我不确定的是为什么当我将其转换回时会出现反斜杠。有人有什么建议吗?我也尝试对JSON进行utf-8编码,但是没有运气。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:3)

您要进行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