我一直在使用该Codable
协议
这是我的JSON
档案:
{
"Adress":[
],
"Object":[
{
"next-date":"2017-10-30T11:00:00Z",
"text-sample":"Some text",
"image-path":[
"photo1.png",
"photo2.png"
],
"email":"john.doe@test.com",
"id":"27"
},
{
"next-date":"2017-10-30T09:00:00Z",
"text-sample":"Test Test",
"image-path":[
"image1.png"
],
"email":"name.lastename@doe.com",
"id":"28"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我只需要关注Object数组,"image-path"数组可以包含0,1或2个字符串.
所以这是我的实现:
struct Result: Codable {
let Object: [MyObject]
}
struct MyObject: Codable {
let date: String
let text: String
let image: [String]
let email: String
let id: String
enum CodingKeys: String, CodingKey {
case date = "next-date"
case text = "text-sample"
case image = "image-path"
case email = "email"
case id = "id"
}
init() {
self.date = ""
self.text = ""
self.image = []
self.email = ""
self.id = ""
}
}
Run Code Online (Sandbox Code Playgroud)
在以这种方式请求和获取JSON数据后,我从我的服务类调用它:
if let data = response.data {
let decoder = JSONDecoder()
let result = try! decoder.decode(Result, from: data)
dump(result.Object)
}
Run Code Online (Sandbox Code Playgroud)
一切正常,除了[String]
对image
财产
但它无法编译,或者我得到"预期解码..."错误.
我该如何处理nil/no数据场景?
我对你做了一个小改动MyObject struct
,即
1.全部标记properties
为optionals
2.删除init()
(我认为这里没有任何要求init()
.)
3.使用Result.self
的,而不是Result
在decoder.decode(...)
方法
struct MyObject: Codable
{
let date: String?
let text: String?
let image: [String]?
let email: String?
let id: String?
enum CodingKeys: String, CodingKey
{
case date = "next-date"
case text = "text-sample"
case image = "image-path"
case email = "email"
case id = "id"
}
}
Run Code Online (Sandbox Code Playgroud)
为了测试上面的内容,我使用了下面的代码,它工作正常.
let jsonString = """
{"Adress": [],
"Object": [{"next-date": "2017-10-30T11:00:00Z",
"text-sample": "Some text",
"image-path": ["photo1.png", "photo2.png"],
"email": "john.doe@test.com",
"id": "27"},
{"next-date": "2017-10-30T09:00:00Z",
"text-sample": "Test Test",
"image-path": ["image1.png"],
"email": "name.lastename@doe.com",
"id": "28"}
]
}
"""
if let data = jsonString.data(using: .utf8)
{
let decoder = JSONDecoder()
let result = try? decoder.decode(Result.self, from: data) //Use Result.self here
print(result)
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的结果值:
归档时间: |
|
查看次数: |
10445 次 |
最近记录: |