我需要使用Swift 4中的Codable解析二维数组,请让我如何做。以下是我的代码
var exclusive = “””
{“list”:[[{“primary_key”:”1",”foreign_key”:”3"},{“primary_key”:”2",”foreign_key”:”10"}],[{“primary_key”:”2",”foreign_key”:”10"},{“primary_key”:”3",”foreign_key”:”22"}]]}
“””
let exeString = try! exclusive.data(using: .utf8)
struct ListStruct : Codable {
struct listStruct :Codable {
let primary_key : Int
let foreign_key : Int
}
let list = [[listStruct]] ()
or
let list = [][listStruct]
}
let listofData = try! JSONDecoder().decode(ListStruct.self, from: exeString!)
有三个基本问题
-
primary_key
和foreign_key
的值是字符串,而不是Int
。有一个简单的规则: double引号包裹的每个JSON值都是字符串,甚至"1"
或"false"
。 -
有一个root对象,它是一个包含一个键
list
的字典。 -
String
的data(using:
不throw
,因此用try
进行标记是错误的。
此代码使用Swift命名约定,骆驼级和下降的变量名称和大量的struct name
let exeString = """
{"list":[[{"primary_key":"1","foreign_key":"3"},{"primary_key":"2","foreign_key":"10"}],[{"primary_key":"2","foreign_key":"10"},{"primary_key":"3","foreign_key":"22"}]]}
"""
struct Root : Decodable {
let list : [[ListStruct]]
}
struct ListStruct :Codable {
private enum CodingKeys : String, CodingKey {
case primaryKey = "primary_key"
case foreignKey = "foreign_key"
}
let primaryKey : String
let foreignKey : String
}
do {
let data = Data(exeString.utf8)
let result = try JSONDecoder().decode(Root.self, from: data)
print(result.list)
} catch { print(error) }
请参阅此
struct Language: Codable {
var name: String
var version: Int
}
let swift = Language(name: "Swift", version: 4)
let encoder = JSONEncoder()
if let encoded = try? encoder.encode(swift) {
if let json = String(data: encoded, encoding: .utf8) {
print(json)
}
let decoder = JSONDecoder()
if let decoded = try? decoder.decode(Language.self, from: encoded) {
print(decoded.name)
}
}