如何从 gzip 读取 json 字符串

Posted

技术标签:

【中文标题】如何从 gzip 读取 json 字符串【英文标题】:How to read json string from gzip 【发布时间】:2020-12-13 14:35:48 【问题描述】:

我正在尝试从 .gz 文件中读取 json 对象。

代码如下:

with gzip.open("C:/Users/shaya/Downloads/sample.gz", 'rb') as fin:
    json_bytes = fin.read()  
    
json_str = json_bytes.decode('utf-8')
data = json.loads(json_str)
print(data)

我收到此错误:

JSONDecodeError: Extra data: line 1 column 2 (char 1)

json 字符串无法转换成 json 对象。

【问题讨论】:

错误出现在json.loads(..),对吗?如果是这样,您必须显示json_str 的值才能获得帮助。 您正在尝试以 json 格式读取 gzip 压缩文件。我不知道你期待什么。 @Marc codebeautify.org/online-json-editor/cb9ebcda 这是 json_str @Aplet123 压缩 json 数据然后读入有什么问题?? json syntax 需要以括号开头。您可以将整个第一行替换为 字符 【参考方案1】:

编辑。正如@CharlesDuffy 所建议的,您已将 tar 压缩包压缩为内部带有 JSON 的文件。有关阅读 gzipped tar 的信息,请参阅第二版。第一个版本仅用于读取 gzip。

第一版

我认为您以某种方式错误地压缩/解压缩了 JSON 数据,因为它在解压缩后包含非 JSON 前导字节。

您要么必须从解压缩的数据中剪切/删除前导非 JSON 字节,要么像下面的代码一样重新创建数据。为了您删除前导错误字节的情况,请在json.loads(...) 之前执行json_str = json_str[json_str.find(''):]

下面是逐步json编码/gzip压缩/写入文件/从文件读取/gzip解压缩/json解码的完整工作代码:

Try it online!

import json, gzip

# Encode/Write

pydata = 
    'a': [1,2,3],
    'b': False,


jdata = json.dumps(pydata, indent = 4)

serial = jdata.encode('utf-8')

with open('data.json.gz', 'wb') as f:
    f.write(gzip.compress(serial))

# Read/Decode
   
serial, pydata, jdata = None, None, None
    
with open('data.json.gz', 'rb') as f:
    serial = gzip.decompress(f.read())
    
jdata = serial.decode('utf-8')

pydata = json.loads(jdata)

print(pydata)

输出:

'a': [1, 2, 3], 'b': False

第二版

下面是在 gzipped tar 文件中读取 JSON 的代码。它从 tar 读取第一个 JSON 文件,如果有多个 json 文件,您可以将 fname = ... 替换为 JSON 文件的正确文件名。

import json, gzip, tarfile, io

with open('data.json.tar.gz', 'rb') as f:
    tserial = gzip.decompress(f.read())
    
with tarfile.open(fileobj = io.BytesIO(tserial), mode = 'r') as f:
    fname = [e for e in f.getnames() if e.lower().endswith('.json')][0]
    serial = f.extractfile(fname).read()
    
jdata = serial.decode('utf-8')

pydata = json.loads(jdata)

print(pydata)

【讨论】:

文件顶部的额外数据是一个 tar 头。 OP 有一个 tar.gz 文件,其中包含一个 JSON 文件,而不是 json.gz 文件。 @CharlesDuffy 谢谢!添加了第二个代码 sn-p 用于使用 JSON 读取 gzipped tar。

以上是关于如何从 gzip 读取 json 字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何将使用 GZIP 压缩的字符串从 Java App 发送到 PHP Web 服务

从 HTTPClient 响应中解压 GZip 流

Swift 3 - 如何从包含字符串的索引中读取 json 输出

我应该如何从 json 字符串中读取数据?苹果手机

从 C# 中的 JSON 读取特定值

如何读取 appSettings.json 中的字符串数组?