1. ホーム
  2. python

[解決済み] JSONからJSONLへのPython変換

2022-02-19 18:35:28

質問

標準的なJSONオブジェクトを、各行が独立した自己完結型の有効なJSONオブジェクトを含む必要があるオブジェクトに操作したいのですが、どうすればよいですか?以下を参照してください。 JSONの行数

JSON_file =

[{u'index': 1,
  u'no': 'A',
  u'met': u'1043205'},
 {u'index': 2,
  u'no': 'B',
  u'met': u'000031043206'},
 {u'index': 3,
  u'no': 'C',
  u'met': u'0031043207'}]

To JSONL :

{u'index': 1, u'no': 'A', u'met': u'1043205'}
{u'index': 2, u'no': 'B', u'met': u'031043206'}
{u'index': 3, u'no': 'C', u'met': u'0031043207'}

私の現在の解決策は、JSONファイルをテキストファイルとして読み込んで、その中の [ という文字列と ] を末尾から削除します。このように、行を含むネストされたオブジェクトではなく、各行で有効なJSONオブジェクトを作成します。

もっとエレガントな解決策はないのだろうか?ファイル上で文字列操作をすると、何か問題が起こるのではないかと思うのですが。

動機は json ファイルをSpark上のRDDに取り込むことができます。関連する質問を参照してください - 。 Apache SparkでJSONを読む - `corrupt_record`.

解決するには?

入力は、次のような連続したものであるように見えます。 Pythonオブジェクト それは確かにJSONドキュメントとして有効ではありません。

Python辞書のリストがあれば、各エントリを別々にファイルにダンプし、その後に改行すればよいだけです。

import json

with open('output.jsonl', 'w') as outfile:
    for entry in JSON_file:
        json.dump(entry, outfile)
        outfile.write('\n')

のデフォルトの構成は json モジュールは、改行を埋め込まないJSONを出力します。

仮に A , BC の名前が本当に文字列である場合、そのような結果が得られます。

{"index": 1, "met": "1043205", "no": "A"}
{"index": 2, "met": "000031043206", "no": "B"}
{"index": 3, "met": "0031043207", "no": "C"}

エントリーのリストを含む JSON ドキュメントから始めた場合、そのドキュメントを最初にパースするために json.load() / json.loads() .