chibaqn /
Posts
2022-08-11 17:09:14

【REST API】レスポンス JSON の array 型は要素がないときに何を返却するべきか

はじめに

REST API の設計をしていて、レスポンスの array 型のフィールドは要素がないときに何を返却するべきか迷ったので、整理する。

候補

フィールドの仕様の候補としては、下記を考えている。

僕は下記の理由で #2 を推す。

  • フィールドの存在チェックや null かどうかのチェックが不要で、扱いが楽だと思う。
  • 要素が無い配列(空配列)も、配列としては不正ではないので、array 型のフィールドは空配列を返すのが正しいと思う。
No. フィールドの仕様 返却するもの
1 任意フィールド フィールド自体を返却しない。
2 必須フィールド 空配列を返却する。
3 必須かつ Nullable フィールド null を返却する。

JSON の仕様

JSON の仕様は RFC 8259 で定義されている。

  • 配列構造は、0個以上の値(または要素)を囲む角括弧として表される。要素はカンマで区切られる。
  • 配列の値が同じ型である必要はない。
  1. Arrays

An array structure is represented as square brackets surrounding zero or more values (or elements). Elements are separated by commas.

array = begin-array [ value *( value-separator value ) ] end-array

There is no requirement that the values in an array be of the same type.

JSON の仕様としては、空配列を返却するのが正しそう。

Google JSON Style Guide

Google が定めている JSON のスタイルガイドでは下記のルールとなっている。

  • フィールドが optional もしくは値が null または空の場合は、特別の理由がない限りフィールド自体を削除する。

Empty/Null_Property_Values - Google JSON Style Guide

Consider removing empty or null values.

If a property is optional or has an empty or null value, consider dropping the property from the JSON, unless there's a strong semantic reason for its existence.

結論

Google JSON Style Guide を参考にして、下記のルールとする。

  • null を API のインターフェイスに持ち込まない。
  • 値が null または空の場合は、フィールド自体を返却しない。
  • 従って、値が null または空になりうるフィールドは optional にする。
  • 取得するかどうかを利用者が選択できるフィールドは optional にする。

※ array 型のフィールドが空配列を返却することはない。

なぜ、このルールか

  • 値が空の状態は array 型以外にも存在する。そして、空の状態を表現できない型も存在する。
  • よって、空の状態を ""[] で表現するのは、一部の型限定のルールになってしまう。
  • 「array 型は常に必須フィールドにして、空の状態を [] で表現する」というルールにすることも可能だが、インターフェイスの定義上「要素が0件の状態もありえるのか」が分からないという問題があると思う。
  • シンプルでかつAPIの利用者が仕様を理解しやすいルールとしたいので、空の状態を null やフィールド自体を返却しない方法以外で表現するのは辞める。
  • また、レスポンスのインターフェイスの各フィールドの状態を 値が返却される or フィールド自体が返却されない のどちらかに限定するために、null を API のインターフェイスに持ち込まない。

空の状態の表現方法

空の状態の表現方法
number 表現不可
string ""
boolean 表現不可
array []
object {}

array 型のフィールドの仕様

要素の仕様 フィールドの仕様
0件のときもありえる optional(0件のときはフィールド自体を返却しない)
常に1件以上 required

おわりに

自分の中での一定のルールができた。

けど、モヤモヤは残っている。業務の中でを引き続き API 設計のスキルを磨いていく。

モヤモヤ🤔

array 型である以上、利用者側は [] が返却されることを想定した作りにするのでは。

つまり、利用者側は array 型のフィールドについては [] が返却されることを想定した作りにするから、下記は問題にならないのでは(「要素が0件の状態もありえるのか」が分かる/分からないに関係なく [] が返却されることを想定したつくりにするから関係ないのでは)。

「array 型は常に必須フィールドにして、空の状態を [] で表現する」というルールにすることも可能だが、インターフェイスの定義上「要素が0件の状態もありえるのか」が分からないという問題があると思う。

optional の場合、利用者側は「フィールド自体が返却されない」ことも想定しないといけない。array 型は常に required にするのが、利用者側的には楽なのでは。

要素の仕様 利用者側が想定すること
optional の場合 ・フィールド自体が返却されない。
[] が返却される。
・1件以上の要素が返却される。
required の場合 [] が返却される。
・1件以上の要素が返却される。

参考資料