Análise JSON usando Decodable
Estou tentando analisar o seguinte JSON usando protocolo decodificável. Sou capaz de analisar o valor da string, comonome da sala. Mas não consigo mapear / analisarproprietários, administradores, membros teclas corretamente. Por exemplo, usando o código abaixo, posso analisar se os valores em proprietários / membros estão vindo como uma matriz. Mas, em alguns casos, a resposta virá como um valor de sequência (consulteos Proprietários chave no JSON), mas não consigo mapear os valores da sequência.
Nota: Valores deadministradores, membros, proprietários pode ser sequência ou matriz (consulte chaves de proprietários e membros em JSON)
{
"roomName": "6f9259d5-62d0-3476-6601-8c284a0b7dde",
"owners": {
"owner": "[email protected]" //This can be array or string
},
"admins": null, //This can be array or string
"members": {
"member": [ //This can be array or string
"[email protected]",
"[email protected]"
]
}
}
Modelo:
struct ChatRoom: Codable{
var roomName: String! = ""
var owners: Owners? = nil
var members: Members? = nil
var admins: Admins? = nil
enum RoomKeys: String, CodingKey {
case roomName
case owners
case members
case admins
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: RoomKeys.self)
roomName = try container.decode(String.self, forKey: .roomName)
if let member = try? container.decode(Members.self, forKey: .members) {
members = member
}
if let owner = try? container.decode(Owners.self, forKey: .owners) {
owners = owner
}
if let admin = try? container.decode(Admins.self, forKey: .admins) {
admins = admin
}
}
}
// Modelo do Proprietário
struct Owners:Codable{
var owner: AnyObject?
enum OwnerKeys:String,CodingKey {
case owner
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: OwnerKeys.self)
if let ownerValue = try container.decodeIfPresent([String].self, forKey: .owner){
owner = ownerValue as AnyObject
}
else{
owner = try? container.decode(String.self, forKey: .owner) as AnyObject
}
}
func encode(to encoder: Encoder) throws {
}
}
// Modelo do Membro
struct Members:Codable{
var member:AnyObject?
enum MemberKeys:String,CodingKey {
case member
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: MemberKeys.self)
if let memberValue = try container.decodeIfPresent([String].self, forKey: .member){
member = memberValue as AnyObject
}
else{
member = try? container.decode(String.self, forKey: .member) as AnyObject
}
}
func encode(to encoder: Encoder) throws {
}
}