【问题标题】:Converting JSON into newline delimited JSON in Python在 Python 中将 JSON 转换为换行符分隔的 JSON
【发布时间】: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_)

【问题讨论】:

    标签: python json google-cloud-platform google-bigquery


    【解决方案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 对象放在一行中。

    资源:

    【讨论】:

    • 非常有效的转换方式。使用 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')
    

    希望这对某人有所帮助。

    【讨论】:

    • 这个方法可以很容易地适应写流数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 2023-03-18
    • 2021-03-22
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    相关资源
    最近更新 更多