在SWIFT 3中正确解析JSON

在SWIFT 3中正确解析JSON

我试图获取一个JSON响应并将结果存储在一个变量中。在以前的SWIFT版本中,我已经有过这种代码的版本,直到GM版本的Xcode 8发布为止。我在StackOverflow上看了几篇类似的文章:SWIFT 2解析JSON-不能订阅‘AnyObject’类型的值SWIFT 3中的JSON解析.

然而,那里传达的想法似乎不适用于这种情况。

如何在SWIFT 3中正确解析JSON响应?在SWIFT 3中读JSON的方式有什么变化吗?

下面是所讨论的代码(可以在操场上运行):

import Cocoalet url = "https://api.forecast.io/forecast/apiKey/37.5673776,122.048951"if let url = NSURL(string: url) {
    if let data = try? Data(contentsOf: url as URL) {
        do {
            let parsedData = try JSONSerialization.jsonObject(with: data as Data, options: .allowFragments)

        //Store response in NSDictionary for easy access        let dict = parsedData as? NSDictionary

        let currentConditions = "\(dict!["currently"]!)"

        //This produces an error, Type 'Any' has no subscript members        
        let currentTemperatureF = ("\(dict!["currently"]!["temperature"]!!)" as NSString).doubleValue           
         //Display all current conditions from API            print(currentConditions)

            //Output the current temperature in Fahrenheit            print(currentTemperatureF)

        }
        //else throw an error detailing what went wrong        catch let error as NSError {
            print("Details of JSON parsing error:\n \(error)")
        }
    }}

编辑:下面是API调用的结果示例print(currentConditions)

["icon": partly-cloudy-night, "precipProbability": 0, "pressure": 1015.39, "humidity": 0.75, "precipIntensity": 0, "windSpeed": 
6.04, "summary": Partly Cloudy, "ozone": 321.13, "temperature": 49.45, "dewPoint": 41.75, "apparentTemperature": 47, "windBearing":
 332, "cloudCover": 0.28, "time": 1480846460]


长风秋雁
浏览 768回答 4
4回答

叮当猫咪

对于SWIFT 3来说,Xcode 8 Beta 6发生了一个很大的变化,那就是id现在作为Any而不是AnyObject.这意味着parsedData作为最有可能与类型一起返回的字典返回。[Any:Any]..如果不使用调试器,我就无法确切地告诉您的强制转换为什么。NSDictionary但你看到的错误是因为dict!["currently"]!有型Any那你怎么解决这个问题?从你引用的方式来看,我想dict!["currently"]!是一本字典,所以你有很多选择:首先,你可以这样做:let&nbsp;currentConditionsDictionary:&nbsp;[String:&nbsp;AnyObject]&nbsp;=&nbsp;dict!["currently"]!&nbsp;as!&nbsp;[String:&nbsp;AnyObject]这将为您提供一个字典对象,然后您可以查询它的值,这样您就可以得到如下所示的温度:let&nbsp;currentTemperatureF&nbsp;=&nbsp;currentConditionsDictionary["temperature"]&nbsp;as!&nbsp;Double或者如果你愿意的话,你可以排队:let&nbsp;currentTemperatureF&nbsp;=&nbsp;(dict!["currently"]!&nbsp;as!&nbsp;[String:&nbsp;AnyObject])["temperature"]!&nbsp;as!&nbsp;Double希望这会有所帮助,恐怕我还没有时间编写一个示例应用程序来测试它。最后一个注意事项:最容易做的事情可能是简单地将JSON有效负载转换到[String: AnyObject]刚开始的时候。let&nbsp;parsedData&nbsp;=&nbsp;try&nbsp;JSONSerialization.jsonObject(with:&nbsp;data&nbsp;as&nbsp;Data,&nbsp;options:&nbsp;.allowFragments)&nbsp;as!&nbsp;Dictionary<String,&nbsp;AnyObject>

30秒到达战场

let&nbsp;str&nbsp;=&nbsp;"{\"names\":&nbsp;[\"Bob\",&nbsp;\"Tim\",&nbsp;\"Tina\"]}"let&nbsp;data&nbsp;=&nbsp;str.data(using:&nbsp;String.Encoding.utf8,&nbsp;allowLossyConversion:&nbsp;false)!do&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;json&nbsp;=&nbsp;try&nbsp;JSONSerialization.jsonObject(with:&nbsp;data,&nbsp;options:&nbsp;[])&nbsp;as!&nbsp;[String:&nbsp;AnyObject] &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;let&nbsp;names&nbsp;=&nbsp;json["names"]&nbsp;as?&nbsp;[String]&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(names)}}&nbsp;catch&nbsp;let&nbsp;error&nbsp;as&nbsp;NSError&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;print("Failed&nbsp;to&nbsp;load:&nbsp;\(error.localizedDescription)")}

繁花如伊

我建的快速型正是为了这个目的。只需粘贴示例JSON,QuickType就会为您的API数据生成此类型层次结构:struct&nbsp;Forecast&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;hourly:&nbsp;Hourly &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;daily:&nbsp;Daily &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;currently:&nbsp;Currently &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;flags:&nbsp;Flags &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;longitude:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;latitude:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;offset:&nbsp;Int &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;timezone:&nbsp;String}struct&nbsp;Hourly&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;icon:&nbsp;String &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;data:&nbsp;[Currently] &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;summary:&nbsp;String}struct&nbsp;Daily&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;icon:&nbsp;String &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;data:&nbsp;[Datum] &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;summary:&nbsp;String}struct&nbsp;Datum&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;precipIntensityMax:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;apparentTemperatureMinTime:&nbsp;Int &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;apparentTemperatureLowTime:&nbsp;Int &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;apparentTemperatureHighTime:&nbsp;Int &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;apparentTemperatureHigh:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;apparentTemperatureLow:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;apparentTemperatureMaxTime:&nbsp;Int &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;apparentTemperatureMax:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;apparentTemperatureMin:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;icon:&nbsp;String &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;dewPoint:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;cloudCover:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;humidity:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;ozone:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;moonPhase:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;precipIntensity:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;temperatureHigh:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;pressure:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;precipProbability:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;precipIntensityMaxTime:&nbsp;Int &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;precipType:&nbsp;String? &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;sunriseTime:&nbsp;Int &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;summary:&nbsp;String &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;sunsetTime:&nbsp;Int &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;temperatureMax:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;time:&nbsp;Int &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;temperatureLow:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;temperatureHighTime:&nbsp;Int &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;temperatureLowTime:&nbsp;Int &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;temperatureMin:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;temperatureMaxTime:&nbsp;Int &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;temperatureMinTime:&nbsp;Int &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;uvIndexTime:&nbsp;Int &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;windGust:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;uvIndex:&nbsp;Int &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;windBearing:&nbsp;Int &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;windGustTime:&nbsp;Int &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;windSpeed:&nbsp;Double}struct&nbsp;Currently&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;precipProbability:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;humidity:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;cloudCover:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;apparentTemperature:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;dewPoint:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;ozone:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;icon:&nbsp;String &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;precipIntensity:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;temperature:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;pressure:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;precipType:&nbsp;String? &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;summary:&nbsp;String &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;uvIndex:&nbsp;Int &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;windGust:&nbsp;Double &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;time:&nbsp;Int &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;windBearing:&nbsp;Int &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;windSpeed:&nbsp;Double}struct&nbsp;Flags&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;sources:&nbsp;[String] &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;isdStations:&nbsp;[String] &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;units:&nbsp;String}它还生成无依赖的封送处理代码,以诱骗JSONSerialization.jsonObject变成Forecast,包括一个使用JSON字符串的方便构造函数,这样您就可以快速解析强类型的Forecast评估和访问其字段:let&nbsp;forecast&nbsp;=&nbsp;Forecast.from(json:&nbsp;jsonString)!print(forecast.daily.data[0].windGustTime)可以从NPM安装QuickTypenpm i -g quicktype或使用web用户界面将生成的完整代码粘贴到操场。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript
Java