使用 Swift 访问 JSON

Posted

技术标签:

【中文标题】使用 Swift 访问 JSON【英文标题】:Accessing JSON with Swift 【发布时间】:2016-03-05 11:45:31 【问题描述】:

我目前正在开发一个应用程序,我想显示有关特定地点的一些信息。我正在使用 Google Places API 来执行此操作,并试图从这个 JSON 响应中提取一些信息:


"html_attributions": [],
"result": 
"address_components": [],
"adr_address": "5, \u003cspan class=\"street-address\"\u003e48 Pirrama Rd\u003c/span\u003e, \u003cspan class=\"locality\"\u003ePyrmont\u003c/span\u003e \u003cspan class=\"region\"\u003eNSW\u003c/span\u003e \u003cspan class=\"postal-code\"\u003e2009\u003c/span\u003e, \u003cspan class=\"country-name\"\u003eAustralia\u003c/span\u003e",
"formatted_address": "5, 48 Pirrama Rd, Pyrmont NSW 2009, Australia",
"formatted_phone_number": "(02) 9374 4000",
"geometry": ,
"icon": "https://maps.gstatic.com/mapfiles/place_api/icons/generic_business-71.png",
"id": "4f89212bf76dde31f092cfc14d7506555d85b5c7",
"international_phone_number": "+61 2 9374 4000",
"name": "Google",
"photos": [],
"place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
"rating": 4.5,
"reference": "CmRaAAAAVvEJLOszIgZMqrn59xg_wEmLJUpC52Zd7HZzzcv0OsaRobY_f8galxBVNsyEgC9nhUsI7BQQcTYCA0t_f8JlhEV-dftt-OhapkRRvQ12g6R3FU-d6OWB-T1vYVIcRuEBEhBha4swICH7pUUsjBRivnHTGhT1Y97NAmr0iWe4qffGJH0iY96GKg",
"reviews": [],
"scope": "GOOGLE",
"types": [
  "point_of_interest",
  "establishment"
],
"url": "https://maps.google.com/?cid=10281119596374313554",
"user_ratings_total": 133,
"utc_offset": 660,
"vicinity": "5 48 Pirrama Road, Pyrmont",
"website": "https://www.google.com.au/about/careers/locations/sydney/"
,
"status": "OK"

我在视图控制器中使用的代码是:

let reposURL = NSURL(string: "https://maps.googleapis.com/maps/api/place/details/json?placeid=\(chosenPlaceID!)&key=SOMEAPIKEY")!

    if let JSONData = NSData(contentsOfURL: reposURL) 

        if let json = (try? NSJSONSerialization.JSONObjectWithData(JSONData, options: [])) as? NSDictionary 

            if let reposArray = json["result"] as? [NSDictionary] 

                for item in reposArray 
                    placeRepositories.append(PlaceRepository(json: item ))
                

            
        
    

我的 placeRepository 控制器中的代码是:

class PlaceRepository 

var name: String?
var formattedAddress: String?
var formattedPhoneNumber: String?
var internationPhoneNumber: String?
var types: [String]?

init(json: NSDictionary) 
    self.name = json["name"] as? String
    self.formattedAddress = json["formatted_address"] as? String
    self.formattedPhoneNumber = json["formatted_phone_number"] as? String
    self.internationPhoneNumber = json["international_phone_number"] as? String
    self.types = json["types"] as? [String]

    

I have put a breakpoint in to try and find out what is going on and the for item in reposArray code is never accessed, it gets skipped over in the previous if statement but I am not sure why? 任何帮助将不胜感激。

谢谢。

【问题讨论】:

【参考方案1】:

您的回复表明 json["result"] 不是字典数组 ...[NSDictionary] ...它的 NSDictionary

改变这一行

if let reposArray = json["result"] as? [NSDictionary]  ... 

if let reposArray = json["result"] as? NSDictionary 
      PlaceRepository(json: reposArray )
   

之后你不能像循环 NSDictionaryfor item in reposArray ..

【讨论】:

现在我收到一条错误消息:placeRepositories.append(PlaceRepository(json: item )) 表示 - 无法将类型“元素”(又名“(键:AnyObject,值:AnyObject)”)的值转换为预期的参数类型“ NSDictionary' 当我运行它时它现在不会给我任何错误但是我将如何访问这些值?我试图做print(placeRepositories.name),但它说 [PlaceRepository] ​​类型的值没有成员“名称” 抱歉,我忘了在我的代码中包含这一位。在视图控制器类的顶部,我声明了一个变量var placeRepositories = [PlaceRepository](),然后我按照您的建议更改了代码,但是将这一行放在placeRepositories.append(PlaceRepository(json: reposArray )) 所以当我尝试打印时我做了print(placeRepositories.name) 但它给了我错误刚刚提到 我想我明白你在说什么我只是不知道如何设置它,所以它以我需要的方式工作。不过感谢您的帮助!你已经超级快速和彻底 我真的不需要它是一个数组然后我这样做,因为我将发送请求并接收关于一个地方的信息然后我只需要访问关于那个地方的不同信息位.【参考方案2】:

您可以使用像SwiftyJson 这样的第三方库,它使 JSON 解析更容易。

【讨论】:

以上是关于使用 Swift 访问 JSON的主要内容,如果未能解决你的问题,请参考以下文章

使用 swift 3 访问 JSON 中的值

Swift IOS 无法使用 Codable 访问 json 数组数据

如何在 swift 中使用 NSDictionary 访问 JSON 子字段

Swift 无法使用枚举初始化程序访问部分 JSON 响应

如何使用 Alamofire 和 Swift Decode 从 JSON 解码和访问 Double

SWIFT 3 访问文件夹中的 JSON