この記事は公開されてから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のデータ傾向の調査に利用すると便利そうかなと思いました。趣味だと色んな使い方が出来そうなので、活用していきたいと思います。