API とかで配列にいろんな型が来ちゃう時にパース側に unknown 型を用意する

github の event とかみたいなやつで

[
    { type: 'aaa', payload: { a: 'A' } },
    { type: 'bbb', payload: { b: 'B'} },
]

みたいな type ごとにその中身が違うみたいな時がたまにある クライアントでパースするとき、例えば swift とかだったら今な codable とかが使えて、割と固くパースするとこんな感じ

struct Event {
    let type: String
    let payload: Payload

    init(from decoder: Decoder) throws {
          ...
          switch type {
              case "aaa"
                  payload = .AAA(try values.decode...)
              case "bbb"
                  payload = .BBB(try values.decode...)
              default:
                  throw
          }
    }
}

enum Payload {
    case AAA(AAAPayload)
    case BBB(BBBPayload)
}

struct AAAPayload {}
struct BBBPayload {}

まぁなんかこういう感じで知らないのが来たら throw されるので、payload に知らないのが decode されることがない。

でもこういうの知らない間に type が増えてたりするので、それで throw されてこの配列全部がわからないことになると、それはそれで困ったなぁとなる。なので知らない場合は unknown みたいなのを Payload enum に追加してそっちにしておくみたいなのにしておけば、まぁ落ちないしいいかなって感じでそうしてる。

取り扱う時に filter なりの作業する必要とかはあるけど。