在 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"
* 我在这里使用StringIO
和print
只是为了让样本更容易在本地测试。
作为替代方案,您可以使用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的主要内容,如果未能解决你的问题,请参考以下文章