話題の記事

無料JSONストレージjsonboxを試してみた!

2019.09.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

昨夜Github Trendsを眺めていたら、jsonboxというリポジトリを見つけ、面白そうだったので試してみました。

そもそもjsonbox

jsonboxは公開された無料のJSONストレージです。制限事項の範囲で自由に使っていいよ!というサービスです。制限事項に関しては後述しています。

README.mdのサービス説明を引用、翻訳します。

HTTP APIを介してJSONデータを無料で保存、読み取り、変更できます。小規模なプロジェクト、プロトタイプ、またはハッカソンに理想的で、独自のデータストアを作成する必要はありません。

基本機能を試してみる

Create

https://jsonbox.io/${BOX_ID}へのPOSTリクエストをすることで、レコード作成できます。同じメッセージでも一意な_idがjsonbox側で振られるので、同じJSONメッセージでも新規レコードとして作成されます。

$ curl -X POST 'https://jsonbox.io/box_shuntaka_1234567' \
    -H 'content-type: application/json' \
    -d '{"name": "Jon Snow", "age": 18}'
{"_id":"5d841d009d1f330017f8f1db","name":"Jon Snow","age":18,"_createdOn":"2019-09-20T00:27:44.105Z"}

BOX_IDは、20文字以上64文字以下の文字列という制限があります。自分で決めるか、jsonbox.ioで生成される文字列を使う方法があります。誰にも使われていない且つ、予測困難な文字列が良いと思います。

JSONを配列にすれば、複数レコード一括作成できます

$ curl -X POST 'https://jsonbox.io/box_shuntaka_1234567' \
    -H 'content-type: application/json' \
    -d '[{"name": "Jon Snow", "age": 18}, {"name": "Jon Snow", "age": 18}]'
{"_id":"5d841d009d1f330017f8f1db","name":"Jon Snow","age":18,"_createdOn":"2019-09-20T00:27:44.105Z"}

Read

レコード全取得

以下のコマンドで、一覧取得できます。

$ curl -X GET 'https://jsonbox.io/box_shuntaka_1234567'
[{"_id":"5d84220d9d1f330017f8f1e4","name":"Jon Snow","age":18,"_createdOn":"2019-09-20T00:49:17.990Z"},{"_id":"5d84220b9d1f330017f8f1e3","name":"Jon Snow","age":18,"_createdOn":"2019-09-20T00:49:15.712Z"}]

フィルタリング機能

保存したデータに対して様々なフィルタリングを行うことができます。以下見やすさを考慮するため、適宜jqを使っています。

機能を紹介するためにサンプルデータを投下

# 3レコード作成
$ curl -X POST 'https://jsonbox.io/box_shuntaka_1234567' \
    -H 'content-type: application/json' \
    -d '[{"name":"Daenerys Targaryen","age":25}, {"name":"Arya Stark","age":16}, {"name":"Jon Snow","age":18}]'
# 内容を確認
$ curl -X GET 'https://jsonbox.io/box_shuntaka_1234567' |jq
[
  {
    "_id": "5d8425f59d1f330017f8f1e9",
    "name": "Arya Stark",
    "age": 16,
    "_createdOn": "2019-09-20T01:05:57.967Z"
  },
  {
    "_id": "5d8425f59d1f330017f8f1ea",
    "name": "Jon Snow",
    "age": 18,
    "_createdOn": "2019-09-20T01:05:57.967Z"
  },
  {
    "_id": "5d8425f59d1f330017f8f1e8",
    "name": "Daenerys Targaryen",
    "age": 25,
    "_createdOn": "2019-09-20T01:05:57.966Z"
  }
]

レコードを指定取得

$ curl -X GET 'https://jsonbox.io/box_shuntaka_1234567/5d8425f59d1f330017f8f1e8'
{"_id":"5d8425f59d1f330017f8f1e8","name":"Daenerys Targaryen","age":25,"_createdOn":"2019-09-20T01:05:57.966Z"}

ageを降順でデータ取得

$ curl -X GET 'https://jsonbox.io/box_shuntaka_1234567?sort=-age'| jq # -ageをageにすれば昇順
[
  {
    "_id": "5d8425f59d1f330017f8f1e8",
    "name": "Daenerys Targaryen",
    "age": 25,
    "_createdOn": "2019-09-20T01:05:57.966Z"
  },
  {
    "_id": "5d8425f59d1f330017f8f1ea",
    "name": "Jon Snow",
    "age": 18,
    "_createdOn": "2019-09-20T01:05:57.967Z"
  },
  {
    "_id": "5d8425f59d1f330017f8f1e9",
    "name": "Arya Stark",
    "age": 16,
    "_createdOn": "2019-09-20T01:05:57.967Z"
  }
]

クエリを使ったレコード取得

# ageが17より大きいレコードを取得
$ curl -X GET 'https://jsonbox.io/box_shuntaka_1234567?q=age:>17' |jq
[
  {
    "_id": "5d8425f59d1f330017f8f1ea",
    "name": "Jon Snow",
    "age": 18,
    "_createdOn": "2019-09-20T01:05:57.967Z"
  },
  {
    "_id": "5d8425f59d1f330017f8f1e8",
    "name": "Daenerys Targaryen",
    "age": 25,
    "_createdOn": "2019-09-20T01:05:57.966Z"
  }
]

# nameがJから始まるレコードを取得
$ curl -X GET 'https://jsonbox.io/box_shuntaka_1234567?q=name:J*'
[{"_id":"5d8425f59d1f330017f8f1ea","name":"Jon Snow","age":18,"_createdOn":"2019-09-20T01:05:57.967Z"}]

# ,で複数のクエリを組み合わせられる
$ curl -X GET 'https://jsonbox.io/box_shuntaka_1234567?q=name:D*,age:>20' # nameがD始まり且つageが20より大きい
[{"_id":"5d8425f59d1f330017f8f1e8","name":"Daenerys Targaryen","age":25,"_createdOn":"2019-09-20T01:05:57.966Z"}] # 該当あり
$ curl -X GET 'https://jsonbox.io/box_shuntaka_1234567?q=name:D*,age:>26' # nameがD始まり且つageが26より大きい
[] # 該当なし

レコード数指定して取得(limit)

$ curl -X GET 'https://jsonbox.io/box_shuntaka_1234567?limit=2' |jq
[
  {
    "_id": "5d8425f59d1f330017f8f1e9",
    "name": "Arya Stark",
    "age": 16,
    "_createdOn": "2019-09-20T01:05:57.967Z"
  },
  {
    "_id": "5d8425f59d1f330017f8f1ea",
    "name": "Jon Snow",
    "age": 18,
    "_createdOn": "2019-09-20T01:05:57.967Z"
  }
]

レコードをスキップして取得(skip)

$ curl -X GET 'https://jsonbox.io/box_shuntaka_1234567?skip=1'| jq
[
  {
    "_id": "5d8425f59d1f330017f8f1ea",
    "name": "Jon Snow",
    "age": 18,
    "_createdOn": "2019-09-20T01:05:57.967Z"
  },
  {
    "_id": "5d8425f59d1f330017f8f1e8",
    "name": "Daenerys Targaryen",
    "age": 25,
    "_createdOn": "2019-09-20T01:05:57.966Z"
  }
]

Update

https://jsonbox.io/box_shuntaka_1234567/${更新対象の_id}へPUTリクエストで更新できます

$ curl -X PUT 'https://jsonbox.io/box_shuntaka_1234567/5d8425f59d1f330017f8f1e9' \
    -H 'content-type: application/json' \
    -d '{"name": "Arya Stark", "age": 23}'
{"message":"Record updated."}

Delete

https://jsonbox.io/box_shuntaka_1234567/${削除対象の_id}へDELETEリクエストで削除できます

$ curl -X DELETE 'https://jsonbox.io/box_shuntaka_1234567/5d84220d9d1f330017f8f1e4'
{"message":"Record removed."}

一括削除したい場合は、jqとxargsを使えば簡単です

$ curl -X GET 'https://jsonbox.io/box_shuntaka_1234567' | jq -r '.[]._id' | xargs -I{} curl -X DELETE 'https://jsonbox.io/box_shuntaka_1234567/{}'
{"message":"Record removed."}{"message":"Record removed."}{"message":"Record removed."}{"message":"Record removed."}{"message":"Record removed."}{"message":"Record removed."}{"message":"Record removed."}

ラッパーライブラリもある

jsonboxを操作するためのラッパーライブラリが用意されています

GoDocを見るといい感じに書けそうですね。。

制限事項

README.mdのLimitationsの翻訳になります

  • リクエストは100KBより大きくしてはいけない
  • 一度に1000を超えるレコードの登録および、取得は不可
  • ボックスに保存するレコードの数に制限はないが、5000件を超えるレコードの大規模なデータセットを保存してAPIを乱用しないこと。これは小規模プロジェクト向けであり、そのため無料で提供されています。

最後に

よかった点は以下の通りです

  • 機能がシンプルでわかりやすい
  • フィルタリング機能が充実している
  • JSONのストレージなので、jqと相性が良い
  • Wrapperライブラリがあり、自分の使い慣れた言語で処理がかける
  • いつでも操作できる!
  • 無料!!

ストレージは公開されているため、仕事だと利用用途が限らます。パブリックなAPIのデータ傾向の調査に利用すると便利そうかなと思いました。趣味だと色んな使い方が出来そうなので、活用していきたいと思います。