在 Python 中将 JSON 转换为换行符分隔的 JSON

Posted

技术标签:

【中文标题】在 Python 中将 JSON 转换为换行符分隔的 JSON【英文标题】:Converting JSON into newline delimited JSON in Python 【发布时间】:2018-12-20 09:24:05 【问题描述】:

我的目标是使用 Python 将 JSON 文件转换为可以从 Cloud Storage 上传到 BigQuery (as described here) 的格式。

我尝试使用newlineJSON 包进行转换,但收到以下错误。

JSONDecodeError: Expecting value or ']': line 2 column 1 (char 5)

有没有人能解决这个问题?

这里是示例 JSON 代码:

[
    "key01": "value01",
    "key02": "value02",
    ...
    "keyN": "valueN"
,

    "key01": "value01",
    "key02": "value02",
    ...
    "keyN": "valueN"
,

    "key01": "value01",
    "key02": "value02",
    ...
    "keyN": "valueN"

]

这是现有的 python 脚本:

with nlj.open(url_samplejson, json_lib = "simplejson") as src_:
    with nlj.open(url_convertedjson, "w") as dst_:
        for line_ in src_:
            dst_.write(line_)

【问题讨论】:

【参考方案1】:

jq 的答案真的很有用,但如果你仍然想用 Python 来做(从问题看来),你可以用内置的 json 模块来做。

import json
from io import StringIO
in_json = StringIO("""[
    "key01": "value01",
    "key02": "value02",

    "keyN": "valueN"
,

    "key01": "value01",
    "key02": "value02",

    "keyN": "valueN"
,

    "key01": "value01",
    "key02": "value02",

    "keyN": "valueN"

]""")

result = [json.dumps(record) for record in json.load(in_json)]  # the only significant line to convert the JSON to the desired format

print('\n'.join(result))

"key01": "value01", "key02": "value02", "keyN": "valueN"
"key01": "value01", "key02": "value02", "keyN": "valueN"
"key01": "value01", "key02": "value02", "keyN": "valueN"

* 我在这里使用StringIOprint 只是为了让样本更容易在本地测试。

作为替代方案,您可以使用Python jq binding 将其与the other answer 结合使用。

【讨论】:

也适用于 python 对象(而不是 JSON 字符串),如下所示:result = [json.dumps(item) for item in items] 我认为这是最好的答案。为了结合文件写入操作,我使用这个答案产生了以下sn-p:data = df.to_dict('records')output = open('test.json', 'w')output.write('\n'.join([json.dumps(record) for record in data]))output.close()【参考方案2】:

如果你愿意退出 Python,请使用jq

$ cat a.json 
[
    "key01": "value01",
    "key02": "value02",
    "keyN": "valueN"
,

    "key01": "value01",
    "key02": "value02",
    "keyN": "valueN"
,

    "key01": "value01",
    "key02": "value02",
    "keyN": "valueN"

]


$ cat a.json | jq -c '.[]'
"key01":"value01","key02":"value02","keyN":"valueN"
"key01":"value01","key02":"value02","keyN":"valueN"
"key01":"value01","key02":"value02","keyN":"valueN"

我使用的迭代器是'.[]' 来遍历数组,-c 将每个 JSON 对象放在一行中。

资源:

https://stedolan.github.io/jq/manual/ https://github.com/stedolan/jq

【讨论】:

非常有效的转换方式。使用 jq 时会实现这一点。 嗨,你也有执行相反动作的命令吗?从换行符到格式良好的 json 数组 完美。但一开始,我通过 npm 错误地抓取了jq,效果并不好。 在 node.js 中,我可以使用 node-jq 库来做同样的事情。 jq.run('.[]', 'data.json', output: 'compact') .then((output) => dataStream.push(output) dataStream.push(null) dataStream.pipe(gcFile.createWriteStream( resumable: false, validation: false, metadata: 'Cache-Control': 'public, max-age=31536000' )) ) .catch((err) => console.log(err) )【参考方案3】:

这需要一个 JSON 文件并转换为 ND-JSON 文件。

import json

with open("results-20190312-113458.json", "r") as read_file:
    data = json.load(read_file)
result = [json.dumps(record) for record in data]
with open('nd-proceesed.json', 'w') as obj:
    for i in result:
        obj.write(i+'\n')

希望这对某人有所帮助。

【讨论】:

这个方法可以很容易地适应写流数据。

以上是关于在 Python 中将 JSON 转换为换行符分隔的 JSON的主要内容,如果未能解决你的问题,请参考以下文章

在python中将空格分隔文件转换为逗号分隔值文件

在 Python 3 中将逗号分隔的字符串转换为 Numpy 数组

在 Python 中将 JSON 转换为 HTML 表

如何在python中将JSON转换为数据框

如何在python中将json转换为csv?

在python中将JSON字典转换为JSON数组