一尘不染

具有多维和多类型数组的Swift 4 JSON可解码

json

{
"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协议。

我也无法将数据转换为字典,因为它将引发错误“预期对字典进行解码,但找到了数组”

有解决这个问题的想法吗?我尝试在数据上强制转换字符串类型,但仍然没有运气…

p / s:如果所有json格式都是字符串类型,那不会有问题,但是由于我从API调用它,因此我没有更改权限。


阅读 200

收藏
2020-07-27

共1个答案

一尘不染

如您所说,您的json数组是多类型的,但您尝试将所有内容解码为String。默认的一致性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]]?
}

在线运行

2020-07-27