NDJSONとかって何?他の似たようなやつと違うの?
はじめに
NDJSONの存在を知らなくて、Elasticsearchのドキュメント見てて、ん?JSON?配列じゃないけど?ってなったのでまとめることにしました。
Bulk API | Elasticsearch Guide [7.14] | Elastic https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html
例:ElasticsearchのBulkAPIの例
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_id" : "2" } }
{ "create" : { "_index" : "test", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }
結論
-
NDJSONは、一度に沢山のJSONを送受信する際に便利な仕様
-
例はこんな感じ
{"some":"thing"} {"foo":17,"bar":false,"quux":true} {"may":{"include":"nested","objects":["and","arrays"]}}
-
表現のブレに注意する
-
JSON Lines
改行区切りのJSON
.jsonl JSONL | jsonl
のいずれかが出てきたら「ああ、NDJSONのことね」と思う- ただし、どれが正解とかではない、というか統一仕様がないし、NDJSONもforkしたやつなのでその辺は柔軟に。
-
JSON-LD | JSONLD
とかが来たら「Linked Dataの話?」って確認する
-
やってみたこと
NDJSONについて調べてみた
-
改行の仕様
- 改行コードは
\n
または\r\n
どちらでもよい - Content-Typeは
application/x-ndjson
- 改行コードは
-
用途
- ストリーミング処理など
- 1行ごとに配列の終了を待たなくて良いため
- 配列を1データとして受け取る場合、配列の終了まで受信側が待つ必要がある
- 1行ごとに配列の終了を待たなくて良いため
- ストリーミング処理など
NDJSONと他の同様のものについて調べてみた
-
Elasicsearchのサイトに、BulkAPIの入力仕様はNDJSONと書いてあった
The actions are specified in the request body using a newline delimited JSON (NDJSON) structure:
-
JSONのオブジェクト単位で送受信するのに使えるものとしては、他にも似たようなものが見つかったキーワードをリストアップしてみた
- NDJSON(newline delimited JSON)
- JSON Lines
- JSON(改行区切りのJSON)
- .jsonl
- LDJSON
-
NDJSONのサイト(http://ndjson.org/)を見てみたらjsonlines.orgからフォークしたって書いてあった
Site forked from jsonlines.org
-
jsonlines.orgには
JSON Lines
と書いてある。その説明としては改行区切りのJSON
と書いてある。あと拡張子は.jsonl
にせよと。This page describes the JSON Lines text format, also called newline-delimited JSON.
JSON Lines files may be saved with the file extension .jsonl.
-
JSON streamingという用語に関するwikipediaにはLine-delimited JSON(
LDJSON
)と書いてあるJSON streaming - Wikipedia https://en.wikipedia.org/wiki/JSON_streaming
- <メモ>デリミタが改行かとかとかで色々場合分けされてるけど、結局配列じゃない方法でオブジェクトを列挙して送る方法について書いてあった、という点では他と同じっぽい
ちょっと角度を変えてMDNのMIME-Typeを調べてみた
よくある MIME タイプ - HTTP | MDN https://developer.mozilla.org/ja/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types
- JSON-LDで検索すると https://json-ld.org/ のサイトを見つけた。
- JSON-LDはLinked Dataとのこと。つまり、データフォーマットの話ではない。
- NDJSONの別名やこれを抱合する統一仕様のようなものは見つからなかった。
- 同じような方法について仕様や実装があるようなので、混同しないように注意が必要そう。
- 歴史的に色々あるようだが、自分が当面で取るべきアクションが決まったので途中で調べるのに飽きてしまった。
- 自分的にまとめてみた。
- 関連するキーワードと関連しないキーワードの認識
- 関連する
- JSON Lines:NDJSONのfork元
- JSON(改行区切りのJSON):こう呼ぶこともある
- .jsonl:JSON Linesの拡張子
- LDJSON
- 関連しない
- JSON-LD:これはLinked data
- 関連するキーワードと関連しないキーワードの認識
参考
- ndjson http://ndjson.org/
- ndjson/ndjson-spec: Specification https://github.com/ndjson/ndjson-spec
- JSON-LD - JSON for Linking Data https://json-ld.org/
- Linked Dataの話
- ndjsonとは? - Qiita https://qiita.com/suin/items/246691382ea2a2b22031
- 一時情報を参考に入れつつ、簡潔に解説してくれて非常にわかりやすい
- jsonl https://wiki.suikawiki.org/n/jsonl$23781
- 色々な規格について触れてあって関係性がわかりやすい
Discussion
ndjsonの作者が「jsonlinesと変わらないからndjsonを非推奨にしてjsonlinesに任せよう」と言っていますね。