🗒️

NDJSONとかって何?他の似たようなやつと違うの?

2021/08/30に公開1

はじめに

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データとして受け取る場合、配列の終了まで受信側が待つ必要がある

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

Untitled

  • 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

参考

Discussion