YAMLで書いてるSwaggerの定義に実装済みのAPIを記述したいが、
レスポンスの定義を手で書くのはしんどい…みたいなときに、
実際に返却しているJSONから生成できれば便利では!?と思ってやってみた。
TL;DR
- QuicktypeでJSONからJSON Schemaを生成
- json2yamlでJSON Schemaをyamlに変換
- Swaggerで読み取れて便利
手順
不要そうなところは各自適宜飛ばしてください。
Quicktypeのインストール
# quicktypeインストールのための手順 # Homebrewインストール /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" # node.js(npm)インストール brew install nodebrew echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile nodebrew install-binary latest # 必要に応じて変えてください # quicktypeインストール npm install -g quicktype
json2yamlのインストール
# json2yamlインストールのための手順 # MacはデフォルトでPython2.7がインストールされているのでそのまま使う # (2019/04/24時点) # pipインストール curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py python get-pip.py --user rm get-pip.py # パスを通す export PATH="$HOME/Library/Python/2.7/bin:$PATH" echo 'export PATH="$HOME/Library/Python/2.7/bin:$PATH"' >> ~/.bash_profile # json2yamlインストール pip install json2yaml --user
実行例
あくまで食わせたJSONの定義のみを吐き出すので、実際のrequiredと正しいかとか、
細かいオブジェクトが網羅できているかはチェックが必要なので注意。
# homeにおいたresponse.jsonをschema.yamlに変換して吐き出す quicktype response.json --lang schema | json2yaml > schema.yaml
生成元のjson
{ "foo": [ 1, null ], "baz": { "foo": [ true, "bar" ], "baz": "qux" } }
yaml変換後のSchema
$schema: http://json-schema.org/draft-06/schema# $ref: '#/definitions/Test' definitions: Test: type: object additionalProperties: false properties: foo: type: array items: anyOf: - type: integer - type: 'null' baz: $ref: '#/definitions/Baz' required: - baz - foo title: Test Baz: type: object additionalProperties: false properties: foo: type: array items: $ref: '#/definitions/Foo' baz: type: string required: - baz - foo title: Baz Foo: anyOf: - type: boolean - type: string title: Foo
平成最後の記事更新でした。
令和でまたお会いしましょう。