notebook

都内でWEB系エンジニアやってます。

dummy-jsonを使ってダミーデータを生成する

dummy-jsonというnodeのライブラリを使ってみたのでメモ

dummy-json

BigQueryなどサンプルのJSONを作ってロードしたいときや、カラムの情報をある程度コントロールしてサンプル作りたいとき

または、モック用にAPIレスポンスを適当に生成したいとき

Rubyでいうfaker的なものをJSON出力で行ってくれるライブラリ

webroo/dummy-json: Generates random dummy JSON data in Node.js

github.com

install

$ npm install -g dummy-json

テンプレート

テンプレートはhandlebars(.hbs)というテンプレートエンジンを使っている

dummy-jsonにはdate,firstNameなどヘルパーがいくつか存在するのでその中から選んでテンプレートを書いていく

結構量があるのでとりあえず使うだけなら最初からあるヘルパーでこと足りる

カスタマイズしたい場合はコードを書けばヘルパーを追加することもできる

適当な値を生成するテンプレートを書いてみた

  • hoge.hbs
[
  {{#repeat min=10 max=100}}
  {
    "id": {{add @index 1}},
    "site_id": {{int 1 1000}},
    "date": "{{date '2010' '2020' 'YYYY-MM-DD'}}",
    "name": "{{firstName}}",
    "image": "{{add (step 10) 0}}.png",
    "classification": "{{random 'foge' 'fuga' 'piyo' 'foo' 'bar' 'baz'}}",
    "color": "{{color}}",
    "guid": "{{guid}}",
    "ip": "{{ipv4}}",
    "value": {{int 0 10000}}
  }
  {{/repeat}}
]

コマンドにテンプレートファイルを渡して実行するだけだとそれっぽい値が入っているJSONが出力される

$ dummyjson hoge.hbs
[
  {
    "id": 1,
    "site_id": 5,
    "date": "2017-07-28",
    "name": "Selma",
    "image": "0.png"
    "classification": "fuga",
    "color": "darkkhaki",
    "guid": "6cf5c255-8b17-493a-8ec9-d25df546f1fe",
    "ip": "87.117.199.90",
    "value": 543
  },
  {
    "id": 2,
    "site_id": 800,
    "date": "2010-05-22",
    "name": "Raylene",
    "image": "10.png"
    "classification": "foge",
    "color": "blueviolet",
    "guid": "159cdea1-9988-4f2e-b682-53e13d6633a3",
    "ip": "99.90.12.168",
    "value": 5345
  },
  .....
  .....
  .....

例では単純な形式のJSONだが入れ子の構造など複雑なJSONもテンプレート次第で書ける

ファイル生成

$ dummyjson hoge.hbs | jq '.[]' -cr > fuga.json

普通に出力するとprettyなJSONになるので件数を出すためjqで少し加工した

例ではBigQueryのロードでも必要なndjson形式にしている

$ wc -l fuga.json
84 fuga.json

モックサーバとして使う

適当なレスポンスを返すだけのためのサーバを用意

  • app.js
const fs = require('fs');
const express = require('express');
const dummyjson = require('dummy-json');

const template = fs.readFileSync('template.hbs', { encoding: 'utf8' });
const app = express();

app.get('/api/people', function(req, res) {
  res.set('Content-Type', 'application/json');
  res.status(200).send(dummyjson.parse(template));
});

app.listen(3000);
  • template.hbs
{
  "users": [
    {{#repeat 2}}
    {
      "id": {{@index}},
      "name": "{{firstName}} {{lastName}}",
      "work": "{{company}}",
      "email": "{{email}}",
      "dob": "{{date '1900' '2000' 'YYYY'}}",
      "address": "{{int 1 100}} {{street}}",
      "city": "{{city}}",
      "optedin": {{boolean}}
    }
    {{/repeat}}
  ],
  "images": [
    {{#repeat 3}}
    "img{{@index}}.png"
    {{/repeat}}
  ],
  "coordinates": {
    "x": {{float -50 50 '0.00'}},
    "y": {{float -25 25 '0.00'}}
  },
  "price": "${{int 0 99999 '0,0'}}"
}
$ npm install express dummy-json
$ node app.js

3000番ポートにアクセスすると生成されたJSONが表示される

簡単!開発中の要件に合わせてとりあえず適当な値を返すようにするだけであれば十分

所感

  • 簡単に適当なデータを持ったデータを生成できた
  • コマンドが用意されているので気軽に使いやすい
  • 独自のヘルパーも書けるようなので機会があれば書いてみたい
  • handlebarsというキーワードを初めて聞いた