这个问题在这里已有答案:
我有一个JSON
{
"tvShow": {
"id": 5348,
"name": "Supernatural",
"permalink": "supernatural",
"url": "http://www.episodate.com/tv-show/supernatural",
"description": "Supernatural is an American fantasy horror television series created by Eric Kripke. It was first broadcast on September 13, 2005, on The WB and subsequently became part of successor The CW's lineup. Starring Jared Padalecki as Sam Winchester and Jensen Ackles as Dean Winchester, the series follows the two brothers as they hunt demons, ghosts, monsters, and other supernatural beings in the world. The series is produced by Warner Bros. Television, in association with Wonderland Sound and Vision. Along with Kripke, executive producers have been McG, Robert Singer, Phil Sgriccia, Sera Gamble, Jeremy Carver, John Shiban, Ben Edlund and Adam Glass. Former executive producer and director Kim Manners died of lung cancer during production of the fourth season.<br>The series is filmed in Vancouver, British Columbia and surrounding areas and was in development for nearly ten years, as creator Kripke spent several years unsuccessfully pitching it. The pilot was viewed by an estimated 5.69 million viewers, and the ratings of the first four episodes prompted The WB to pick up the series for a full season. Originally, Kripke planned the series for three seasons but later expanded it to five. The fifth season concluded the series' main storyline, and Kripke departed the series as showrunner. The series has continued on for several more seasons with Sera Gamble and Jeremy Carver assuming the role of showrunner.",
"description_source": "http://en.wikipedia.org/wiki/Supernatural_(U.S._TV_series)#Spin-off_series",
"start_date": "2005-09-13",
"end_date": null,
"country": "US",
"status": "Running",
"runtime": 60,
"network": "The CW",
"youtube_link": "6ZlnmAWL59I",
"image_path": "https://static.episodate.com/images/tv-show/full/5348.jpg",
"image_thumbnail_path": "https://static.episodate.com/images/tv-show/thumbnail/5348.jpg",
"rating": "9.6747",
"rating_count": "249",
"countdown": null
}
}
rating
在不同序列中的值为 Int
("rating":0)或 String
("rating":"9.6747") .
我正在使用Codable / Decodable协议解析JSON:
struct DetailModel : Decodable {
var id : Int?
var name : String?
var permalink : String?
var url : String?
var description : String
var description_source : String?
var start_date : String?
var end_date : String?
var country : String?
var status : String?
var runtime : Int?
var network : String?
var youtube_link : String?
var image_path : String?
var image_thumbnail_path : String?
var rating: String
var rating_count : String?
var countdown : String?
var genres : [String]?
var pictures : [String]?
var episodes : [EpisodesModel]?
}
如果rating == String,我的代码工作,我有来自JSON的所有变量,但如果rating == Int,则全部是 nil
. 我应该怎样做才能一次解析 rating
和 String
变量的所有类型?
我的可解码功能:
func searchSerialDetail(id: Int, completion: @escaping (DetailModel?) -> Void){
let parameters: [String: Any] = ["q": id]
Alamofire.request(DetailNetworkLayer.url, method: .get, parameters: parameters).response { (jsonResponse) in
if let jsonValue = jsonResponse.data {
let jsonDecoder = JSONDecoder()
let detail = try? jsonDecoder.decode(DetailModel.self, from: jsonValue)
completion(detail)
}
}
}
谢谢 .
1 回答
您必须实现自己的
func encode(to encoder: Encoder) throws
和init(from decoder: Decoder) throws
,它们都是Codable
协议的属性 . 然后将rating
变量更改为 enum看起来像这样:
然后在
DetailModel
上将rating: String
更改为rating: Rating
这有效,我已经使用这些JSON字符串进行了测试 .
Edit :我找到了一种更好的实现
init(from decoder: Decoder) throws
的更快捷方式,它产生了更好的错误信息,通过使用它你现在可以省略ParseError
枚举 .