{ "values":[ [1,1,7,"Azuan Child","Anak Azuan","12345","ACTIVE","Morning",7,12,"2017-11-09 19:45:00"], [28,1,0,"Azuan Child2","Amran","123456","ACTIVE","Evening",1,29,"2017-11-09 19:45:00"] ] }
好的,这是我从服务器收到的json格式
现在我想将其解码为我的结构,但仍然没有运气。
struct ChildrenTable: Decodable { var values: [[String]]? }
我在URLSession上的调用方方法如下所示
URLSession.shared.dataTask(with: request) { (data, response, err) in guard let data = data else { return } let dataAsString = String(data: data, encoding: .utf8) print(dataAsString) do { let children = try JSONDecoder().decode(ChildrenTable.self, from: data) print (children) } catch let jsonErr { print ("Error serializing json: ", jsonErr) } }.resume()
我得到的错误是
Error serializing json: typeMismatch(Swift.String, Swift.DecodingError.Context(codingPath: [Vito_Parent.ChildrenTable.(CodingKeys in _1B826CD7D9609504747BED0EC0B7D3B5).values, Foundation.(_JSONKey in _12768CA107A31EF2DCE034FD75B541C9)(stringValue: "Index 0", intValue: Optional(0)), Foundation.(_JSONKey in _12768CA107A31EF2DCE034FD75B541C9)(stringValue: "Index 0", intValue: Optional(0))], debugDescription: "Expected to decode String but found a number instead.", underlyingError: nil))
我知道数组中有一个整数,并且我只将String转换为值var values: [[String]]?(此错误弹出窗口的原因),但是我根本不能在结构中使用任何多维数组或元组,因为它遵循Decodable协议。
var values: [[String]]?
我也无法将数据转换为字典,因为它将引发错误“预期对字典进行解码,但找到了数组”
有解决这个问题的想法吗?我尝试在数据上强制转换字符串类型,但仍然没有运气…
p / s:如果所有json格式都是字符串类型,那不会有问题,但是由于我从API调用它,因此我没有更改权限。
如您所说,您的json数组是多类型的,但您尝试将所有内容解码为String。默认的一致性String,以Decodable不允许。我想到的唯一解决方案是引入新类型。
String
Decodable
struct IntegerOrString: Decodable { var value: Any init(from decoder: Decoder) throws { if let int = try? Int(from: decoder) { value = int return } value = try String(from: decoder) } } struct ChildrenTable: Decodable { var values: [[IntegerOrString]]? }
在线运行