0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[NDJSON] 可変データを扱いやすくするシンプルなフォーマット

Posted at

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 が使用される.
  • 可読性や柔軟性の面で,可変パラメータにも対応しやすい.
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?