前回、SwiftでJSONDecoderを使った処理方法を書きました。今回JSONキーにハイフンが混ざった処理をご紹介します。ハイフン(hyphen)が入った変数を作成することができません。ビルドエラーになってしまいます。しかしWeb上のAPIにはハイフンが混ざったキーもよく見かけます。例えば下記のようなJSONです。
{ "name-1": "Lenina Crowne" }
この場合”name–1“なので下記のようにしたいのですがこれではビルドできません。
JSONキーにハイフンが含まれる場合CodingKeyが含まれたenum宣言を構造体に埋めてキー名の変換を行います。
struct TJson : Codable { var name1: String enum CodingKeys : String, CodingKey { case name1 = "name-1" } }
enumの名称は「CodingKeys」とする必要があるようです。他の名前ではビルドは成功するものの実行するとエラーになりました。
struct TCodingKeyJSONView: View { @State var json1 = """ { "name-1": "Lenina Crowne" } """ var body: some View { Text(jsonConvert(json1).name1) } func jsonConvert(_ s1: String) -> TJson { do { return try JSONDecoder().decode(TJson.self, from: s1.data(using: .utf8)! ) } catch { return TJson(name1: "") } } }
JSONEncoderを使ってTJsonからJSON文字列に変換も試してみました。
struct TCodingKeyJSONView: View { var body: some View { Text(tJsonToJsonStr(TJson(name1: "Bernard Marx"))) } func tJsonToJsonStr(_ j: TJson) -> String{ let enc = JSONEncoder() do { let d1 = try enc.encode(j) return String(data: d1, encoding: .utf8)! } catch { return "{}" } } }
JSONEncoderもうまく動きました。