In a nutshell
NDJSON(Newline Delimited JSON)は,各行を独立したJSONオブジェクトとして扱うデータフォーマット.大規模データやストリーミング処理に適しており,処理が効率的. JSONと互換性がありながら,より扱いやすい記述形式を提供する.
はじめに
あるシミュレーションのパラメータセットを単純にtxtファイルに記述していた.これは自動的に行っていた為に負担では無かったのだが,変数の増減もあり,可読性に難を感じていた.
前述の通り,記述したい変数の増減もある為,csvでは列方向を上手く生かせない.そこで,NDJSONというJSONファイルのフォーマットを知った為,調べた事を以下に纏めた.
以前のtxtファイルのイメージ
下に長く,キーは増減する.,を利用せず,単にスペースだけで適当に出力をしていた.よって,スペース区切りのため,どの値がどのキーに対応するかが一目で分かりづらいという問題があった.
AAA 12 BBB 64 CCC 3 DDD 64 EEE 0 FFF 10
AAA 24 BBB 64 CCC 3 DDD 64 EEE 0 FFF 10
AAA 24 BBB 64 CCC 3 EEE 0
AAA 24 BBB 128 DDD 64 EEE 0
AAA 12 BBB 64 CCC 3 EEE 0
AAA 12 BBB 64 CCC 3 DDD 64 EEE 1 FFF 5
NDJSONにすると以下となる
{"AAA": 12, "BBB": 64, "CCC": 3, "DDD": 64, "EEE": 0, "FFF": 10}
{"AAA": 24, "BBB": 64, "CCC": 3, "DDD": 64, "EEE": 0, "FFF": 10}
{"AAA": 24, "BBB": 64, "CCC": 3, "EEE": 0}
{"AAA": 24, "BBB": 128, "DDD": 64, "EEE": 0}
{"AAA": 12, "BBB": 64, "CCC": 3, "EEE": 0}
{"AAA": 12, "BBB": 64, "CCC": 3, "DDD": 64, "EEE": 1, "FFF": 5}
予想される読み手
- データ形式,データフォーマットについて,初学者である
- JSONに関して初学者であるが,知りたいと思っている.
- NDJSON について詳しく知らない.
NDJSON とは?
NDJSON(Newline Delimited JSON)とは,JSONデータを1行単位で独立した形式で記述するデータフォーマットのこと.各行が1つのJSONオブジェクトとなり,\n
(改行指示)で区切られる.
特徴
- 行ごとにデータを処理できる為,ストリーミング処理が容易であり,大規模データの取り扱いに適している.
- 各行は標準的なJSONオブジェクトなのでJSONと互換性があり,通常のJSONパーサーで扱える.
- 既存のデータに新規データの追加が容易(n番目の行に操作するだけ)
記述例
{"name": "Sato", "age": 25}
{"name": "Suzuki", "age": 30}
{"name": "Sonoda", "age": 40}
用途やシチュエーション
- ログデータの保存
- ストリーミングデータ処理(Kafka, Elasticsearchなど)
- 大規模データの効率的な読み書き
拡張子について:
NDJSONの拡張子は通常 .ndjson
だが,.jsonl
もよく使われる
-
.ndjson
-> 公式サイト(ndjson.org)で推奨されている標準の拡張子 -
.jsonl
-> 「JSON Lines」の略で,同じNDJSONフォーマットを指す
どちらの拡張子も内容は同じで,各行が独立したJSONオブジェクトである.ただし,一部のツールでは.ndjson
と.jsonl
のどちらかに最適化されている場合がある為,用途に応じて選択すると良い.
JSON と NDJSON の違い
NDJSONは特定のフォーマットではなく,JSONのフォーマットの一種.つまりJSONの派生ではなく,JSONを「改行区切りで並べる」ことで,データのストリーミング処理を容易にする指針(ルール)である.
JSONとの関係
NDJSONの各行は標準のJSONオブジェクトだが,ファイル全体が1つのJSON構造を持つわけではない.通常のJSONは1つの配列やオブジェクトで構成されるが,NDJSONは各行が独立したJSONオブジェクトである.
JSONとの違い
比較項目 | JSON | NDJSON |
---|---|---|
構造 | 配列 [{...}, {...}]
|
各行が独立したJSON {...}
|
読み書き | 全体をパースする必要あり | 1行ずつ処理可能 |
ストリーミング | 向かない | 向いている |
例
JSONでの記述例
[
{"product": "book", "price": 1500},
{"product": "PC", "price": 80000}
]
NDJSONでの記述例.各行は独立したJSONオブジェクト
{"product": "book", "price": 1500}
{"product": "PC", "price": 80000}
上記の通り,NDJSONは「JSONの派生」というより,「JSONを扱いやすくするための記述ルール」である.
Summary
- NDJSONは1行ごとにJSONオブジェクトを記述するフォーマット.
- JSON全体を読み込まずに1行ずつ処理でき,効率的.
- ストリーミング処理やログデータに適している.
- 拡張子は
.ndjson
または.jsonl
が使用される. - 可読性や柔軟性の面で,可変パラメータにも対応しやすい.