欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

Swift

當(dāng)前位置:主頁 > 軟件編程 > Swift >

Swift利用Decodable解析JSON的一個(gè)小問題詳解

來源:本站原創(chuàng)|時(shí)間:2020-01-11|欄目:Swift|點(diǎn)擊: 次

前言

Swift 4是蘋果計(jì)劃于2017年秋季推出的最新版本,其主要重點(diǎn)是提供與Swift 3代碼的源兼容性,并努力實(shí)現(xiàn)ABI穩(wěn)定性。從Swift4開始提供的Decodable解析JSON確實(shí)很方便,但遇到一個(gè)小問題,記錄一下。

當(dāng)JSON中某個(gè)key的值為{}或者空字符串”“,而該值需要解析的不是基本類型時(shí),即使標(biāo)記為 Optional,依然會(huì)導(dǎo)致整個(gè)解析失?。?/p>

//: Playground
import Foundation

//Book.swift
struct Book: Codable {
 var id: Int
 var name: String
 var cover: BookCover?

 enum CodingKeys: String, CodingKey {
 case id
 case name
 case cover
 }

 struct BookCover: Codable {

 var url: String
 var thumbURL: String

 enum CodingKeys: String, CodingKey {
 case url
 case thumbURL = "thumb_url"
 }
 }
}

//JSON
let bookJSON1 =
"""
{
 "id": 1,
 "name": "fake name 1",
 "cover": {
 "url": "a.png",
 "thumb_url": "b.png"
 }
}
"""

let bookJSON2 =
"""
{
 "id": 2,
 "name": "fake name 2",
 "cover": {

 }
}
"""

//解析
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let book1 = try? decoder.decode(Book.self, from: bookJSON1.data(using: .utf8)!)

// 解析正常
print(book1)
let book2 = try? decoder.decode(Book.self, from: bookJSON2.data(using: .utf8)!)
// 輸出 nil,cover已經(jīng)是 Optional,為何整個(gè)book都解析失???
print(book2)

原因:

因?yàn)閏over是 Optional,所以會(huì)調(diào)用 decodeIfPresent 來解析,而在cover節(jié)點(diǎn)中沒有找到url,thumb_url這兩個(gè)key,導(dǎo)致默認(rèn)解析失敗,直接拋出了錯(cuò)誤。

解決:

重新實(shí)現(xiàn) decodeIfPresent,在解析失敗時(shí)返回nil而不是拋出錯(cuò)誤導(dǎo)致整個(gè)解析失?。?/p>

extension KeyedDecodingContainer {
 public func decodeIfPresent<T>(_ type: T.Type, forKey key: K) throws -> T? where T : Decodable {
 return try? decode(type, forKey: key)
 }
}

參考: http://davelyon.net/2017/08/16/jsondecoder-in-the-real-world

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對我們的支持。

上一篇:Swift中defer關(guān)鍵字推遲執(zhí)行示例詳解

欄    目:Swift

下一篇:swift中defer幾個(gè)簡單的使用場景詳解

本文標(biāo)題:Swift利用Decodable解析JSON的一個(gè)小問題詳解

本文地址:http://mengdiqiu.com.cn/a1/Swift/11966.html

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有