2017-11-19 8 views
0

をint型:スウィフト4コード可能な配列との私は、このJSONを持っているとしましょう

{ 
    "array": [ 
     33, 
     {"id": 44, "name": "Jonas"} 
    ] 
} 

私はこのJSONをデシリアライズするために迅速な4コード可能な構造体を作成するにはどうすればよいですか?

struct ArrayStruct : Codable { 
    // What do I put here? 
} 
+0

あなたの文字列には、有効なJSONではありません。あなたは ''配列 ''を意味しますか:['? –

+0

'[Any]'はDecodableプロトコルに準拠していないことに注意してください。 –

答えて

1

JSONに小さなエラーがあります(arrayの後にコロンがありません)。あなたは、配列の要素は、関連付けられた値を持つ列挙型であることを宣言することができます

let jsonData = """ 
{ 
    "array": [ 
     33, 
     {"id": 44, "name": "Jonas"} 
    ] 
} 
""".data(using: .utf8)! 

enum ArrayValue: Decodable { 
    case int(Int) 
    case person(Person) 

    init(from decoder: Decoder) throws { 
     let container = try decoder.singleValueContainer() 

     if let value = try? container.decode(Int.self) { 
      self = .int(value) 
     } else if let value = try? container.decode(Person.self) { 
      self = .person(value) 
     } else { 
      let context = DecodingError.Context(codingPath: container.codingPath, debugDescription: "Unknown type") 
      throw DecodingError.dataCorrupted(context) 
     } 
    } 
} 

struct Person: Decodable { 
    var id: Int 
    var name: String 
} 

struct ArrayStruct: Decodable { 
    var array: [ArrayValue] 
} 

let temp = try JSONDecoder().decode(ArrayStruct.self, from: jsonData) 
print(temp.array) 

(それはあなたがほとんどの時間を必要とするものが考えられますよう、上記のコードだけDecodableを示すがEncodableが同様のアイデアに従っています。)

関連する問題