Swift 4 JSONSerialization.jsonObject

Swift 4 JSONSerialization.jsonObject,第1张

概述我正在使用 Xcode 9.2和 Swift 4.如何检查返回的json数据是否为空? 现在它给了我错误如果json [0] [“data”]类型’Any’在行没有下标成员 var json: NSMutableArray = []var newsArray: NSMutableArray = []let url = URLFactory()var data = try! NSData(c 我正在使用 Xcode 9.2和 Swift 4.如何检查返回的Json数据是否为空?
现在它给了我错误如果Json [0] [“data”]类型’Any’在行没有下标成员

var Json: NSMutableArray = []var newsArray: NSMutableArray = []let url = URLFactory()var data = try! NSData(contentsOf: url.getURL()) as Datado {    Json = try JsONSerialization.JsonObject(with: data,options: []) as! NSMutableArray    if Json[0]["data"] {        // data is not null    }} catch let error as NSError {    // handle error}

我的JsON返回如下内容:

{   "data":   [      {         "news_ID":123,"Title":"Title","news_date":"2017-02-08 21:46:06","news_url":"url","short_description":"description","category_ID":4,"category_name":"Health","latlng":         [            {               "lat":"43.003429","lng":"-78.696335"            }         ]      }      { ....}
解决方法 如果您使用的是Swift 4,我可能会建议使用JsONDecoder:

首先,定义保存解析数据的类型:

struct ResponSEObject: Codable {    let data: [NewsItem]}struct NewsItem: Codable {    let newsID: Int    let Title: String    let newsDate: Date    let newsURL: URL    let shortDescription: String    let categoryID: Int    let categoryname: String    let coordinates: [Coordinate]    // because your Json keys don't follow normal Swift naming convention,use CodingKeys to map these property names to JsON keys    enum CodingKeys: String,CodingKey {        case newsID = "news_ID"        case Title        case newsDate = "news_date"        case newsURL = "news_url"        case shortDescription = "short_description"        case categoryID = "category_ID"        case categoryname = "category_name"        case coordinates = "latlng"    }}struct Coordinate: Codable {    let lat: String    let lng: String}

然后你可以解析它:

let formatter = DateFormatter()formatter.locale = Locale(IDentifIEr: "en_US_POSIX")formatter.timeZone = TimeZone(secondsFromGMT: 0)formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"let decoder = JsONDecoder()decoder.dateDeCodingStrategy = .formatted(formatter)do {    let responSEObject = try decoder.decode(ResponSEObject.self,from: data)    print(responSEObject.data)} catch {    print(error)}

显然,如果你的JsON不同,你可能需要相应地改变你的对象(例如,奇怪的是latlng是一个坐标数组).此外,如果要将这些字符串中的一些转换为数字,则可以定义自定义init(from :)方法,但我宁愿修复JsON(为什么latlng返回字符串值而不是数值).

有关更多信息,请参阅Encoding and Decoding Custom Types.

顺便说一句,我建议不要使用这种模式(注意,这是你的网络请求逻辑,但切除了NSData):

let data = try! Data(contentsOf: url.getURL())

这将同步检索数据,这可能会有问题,因为

>在检索数据时,应用程序将被冻结,导致用户体验不佳;
>您可能会面临查看冻结应用程序的监视程序进程杀死您的应用程序的风险;和
>您没有强大的错误处理,如果网络请求失败,这将会崩溃.

我建议使用URLSession:

let task = URLSession.shared.dataTask(with: url.getURL()) { data,_,error in    guard let data = data,error == nil else {        print(error ?? "UnkNown error")        return    }    // Now parse `data` like shown above    // if you then need to update UI or model objects,dispatch that back    // to the main queue:    dispatchQueue.main.async {        // use `responSEObject.data` to update model objects and/or UI here    }}task.resume()
总结

以上是内存溢出为你收集整理的Swift 4 JSONSerialization.jsonObject全部内容,希望文章能够帮你解决Swift 4 JSONSerialization.jsonObject所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1001586.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存