👻

Node.jsを使って、JSON:APIに準拠しているかを検証する

2024/07/18に公開

概要

JSON:APIに準拠しているかを検証するにあたり、以下のリポジトリを使用してみましたので、備忘録です。

https://github.com/elliotttf/jsonapi-validator

本記事執筆時点において、7年前から更新がされていないようなので、最新のスキーマ等には非対応かもしれませんが、簡単な検証は行うことができました。

使い方

上記のライブラリを試すにあたり、以下のリポジトリを用意しました。

https://github.com/nakamura196/jsonapi-validator-demo

インストール

nvmの利用を前提していますが、必須ではありません。

git clone https://github.com/nakamura196/jsonapi-validator-demo
cd jsonapi-validator-demo
nvm i 22
nvm use 22
pnpm i

試す

OKの例

{
    "jsonapi": {
        "version": "1.0",
        "meta": {
            "links": {
                "self": {
                    "href": "http://jsonapi.org/format/1.0/"
                }
            }
        }
    },
    "data": [
        {
            "type": "record",
            "id": "10_A0024853",
            "attributes": {
                "title": "サンプル"
            }
        }
    ]
}
./node_modules/jsonapi-validator/bin/jsonapi-validator.js -f ./01_valid.json
01_valid.json is valid JSON API.

NGな例:不要なプロパティあり

aaaという不要なプロパティがあります。

{
    "jsonapi": {
        "version": "1.0",
        "meta": {
            "links": {
                "self": {
                    "href": "http://jsonapi.org/format/1.0/"
                }
            }
        }
    },
    "aaa": {
        "bbb": "ccc"
    },
    "data": [
        {
            "type": "record",
            "id": "10_A0024853",
            "attributes": {
                "title": "サンプル"
            }
        }
    ]
}
./node_modules/jsonapi-validator/bin/jsonapi-validator.js -f ./02_invalid_additional_properties.json 
Invalid JSON API.
  should NOT have additional properties.
  schemaPath: #/additionalProperties
  additionalProperty: aaa
  should NOT have additional properties.
  schemaPath: #/additionalProperties
  additionalProperty: aaa
  should NOT have additional properties.
  schemaPath: #/additionalProperties
  additionalProperty: data
  should have required property 'errors'.
  schemaPath: #/required
  missingProperty: errors
  should NOT have additional properties.
  schemaPath: #/additionalProperties
  additionalProperty: aaa
  should NOT have additional properties.
  schemaPath: #/additionalProperties
  additionalProperty: data
  should have required property 'meta'.
  schemaPath: #/required
  missingProperty: meta
  should match exactly one schema in oneOf.
  schemaPath: #/oneOf

NGな例:必要なプロパティがない

typeという必要なプロパティがない例です。

{
    "jsonapi": {
        "version": "1.0",
        "meta": {
            "links": {
                "self": {
                    "href": "http://jsonapi.org/format/1.0/"
                }
            }
        }
    },
    "data": [
        {
            "id": "10_A0024853",
            "attributes": {
                "title": "サンプル"
            }
        }
    ]
}
./node_modules/jsonapi-validator/bin/jsonapi-validator.js -f ./03_invalid_missing_property.json     
Invalid JSON API.
  should be object.
  schemaPath: #/type
  type: object
  should have required property 'type'.
  schemaPath: #/required
  missingProperty: type
  should be null.
  schemaPath: #/oneOf/2/type
  type: null
  should match exactly one schema in oneOf.
  schemaPath: #/oneOf
  should NOT have additional properties.
  schemaPath: #/additionalProperties
  additionalProperty: data
  should have required property 'errors'.
  schemaPath: #/required
  missingProperty: errors
  should NOT have additional properties.
  schemaPath: #/additionalProperties
  additionalProperty: data
  should have required property 'meta'.
  schemaPath: #/required
  missingProperty: meta
  should match exactly one schema in oneOf.
  schemaPath: #/oneOf

まとめ

JSON:APIの利用にあたり、参考になりましたら幸いです。

Discussion