Argo でnullの場合に空文字や配列を得る。

ArgoはSwiftJSONのParse処理を簡潔に記載できるライブラリです。

github.com

ちょっと古い記事ですが まだSwiftyJSONで消耗してるの? - Qiita でも紹介されています。

ただ、今回のアプリでは以下の振る舞いの方が都合が良くメソッドを追加しました。

  • JSON の型が 文字列 で値が null の場合に空文字として扱う
  • JSON の型が 配列 で値が null の場合に空の配列として扱う
import Argo

infix operator <||?? { associativity left precedence 150 }

private func <| <A where A: Decodable, A == A.DecodedType>(json: JSON, kv:(key:String, orValue:A)) -> Decoded<A> {
    return json <|? kv.key >>- { $0 == nil ? pure(kv.orValue) : pure($0!) }
}

/**
 受け手がString(not Optional)でJSONがnullの場合に空文字を取得します。
 
 - parameter json: json
 - parameter key:  key
 
 - returns: value or empty
 */
func <| (json: JSON, key: String) -> Decoded<String> {
    return json <| (key: key, orValue: "")
}

/**
 受け手がArray(not Optional)でJSONがnullの場合に空のArrayを取得します。
 <|| では コンパイラが ambiguous と怒ってくるので <||?? で定義します。
 
 - parameter json: json
 - parameter key:  key
 
 - returns: value or empty array
 */
func <||?? <A where A: Decodable, A == A.DecodedType>(json: JSON, key: String) -> Decoded<Array<A>> {
    return (json <||? key >>- { $0 == nil ? pure([]) : pure($0!) })
}

数値型のプロパティが null の場合に -1 を得るなどのカスタマイズも可能です。