如何在 Swift 中解析特定的 JSON

Posted

技术标签:

【中文标题】如何在 Swift 中解析特定的 JSON【英文标题】:How to parse particular JSON in Swift 【发布时间】:2018-10-22 16:45:12 【问题描述】:

为了解析 JSON,我在网上也找到了,我通常使用这种代码:

guard let results = receivedUserJSON["results"] as? [String: Any] else 
    print("Error interpreting results")
    return

这一次我有一个问题,因为它似乎以这个守卫 let 的 else 结尾。 JSON 具有以下结构:


    "results": [
        "gender": "female",
        "name": 
            "title": "mrs",
            "first": "silene",
            "last": "almeida"
        ,
        "location": 
            "street": "2594 rua maranhão ",
            "city": "pouso alegre",
            "state": "distrito federal",
            "postcode": 20447,
            "coordinates": 
                "latitude": "-70.0198",
                "longitude": "123.6577"
            ,
            "timezone": 
                "offset": "+4:30",
                "description": "Kabul"
            
        ,
        "email": "silene.almeida@example.com",
        "login": 
            "uuid": "d06a46b3-1c00-42be-b8fc-d271bf901f7d",
            "username": "silversnake251",
            "password": "ventura",
            "salt": "UcckU6RG",
            "md5": "7c8c4129587c61da01ca7cf4f88353c5",
            "sha1": "6cbf7ec377ff4ebad5a392ec487343bf613858ef",
            "sha256": "8dedf3649fb833a1936b8885627b86c6cf02062eb74f727b2cbd674a30f73e75"
        ,
        "dob": 
            "date": "1969-07-13T00:58:26Z",
            "age": 49
        ,
        "registered": 
            "date": "2003-09-28T09:44:56Z",
            "age": 15
        ,
        "phone": "(95) 0094-8716",
        "cell": "(20) 1014-3529",
        "id": 
            "name": "",
            "value": null
        ,
        "picture": 
            "large": "https://randomuser.me/api/portraits/women/66.jpg",
            "medium": "https://randomuser.me/api/portraits/med/women/66.jpg",
            "thumbnail": "https://randomuser.me/api/portraits/thumb/women/66.jpg"
        ,
        "nat": "BR"
    ],
    "info": 
        "seed": "dd971cddf636d2d7",
        "results": 1,
        "page": 1,
        "version": "1.2"
    

我应该怎么做才能正确解析这个 JSON?我不想使用 Codable 解决方案,因为我不需要所有这些值。

PS:我知道 json 是正确的,因为我尝试并打印了它:

if let JSONString = String(data: responseData, encoding: String.Encoding.utf8) 
    print(JSONString)

【问题讨论】:

在 Guard Else 处下断点,并发布当时 receivedUserJSON["results"] 的值 Json 如您所述是有效的。问题是您的结果是 [String: Any] 的数组,而您将其解析为 [String: Any]。试试看,让 results = receivedUserJSON["results"] as? [[String: Any]] else print("Error interpreting results") return 这应该会给你结果。 请查看使用 Swift Codable 和实际模型.. 【参考方案1】:

results 是一个数组

guard let results = receivedUserJSON["results"] as? [[String:Any]] else 
            print("Error interpreting results")
            return
        

我看不出它是一个数组的价值,因为它包含 1 个元素,所以你可能会考虑改变这个 json

目前的结构


    "results": [],
    "info": 
        "seed": "dd971cddf636d2d7",
        "results": 1,
        "page": 1,
        "version": "1.2"
    

你可以改成


    "results": ,
    "info": 
        "seed": "dd971cddf636d2d7",
        "results": 1,
        "page": 1,
        "version": "1.2"
    


【讨论】:

这解决了!非常感谢你。无法更改 JSON 的结构,因为我正在使用一些 API,非常感谢! @Garu94 你也可以考虑使用 Codable

以上是关于如何在 Swift 中解析特定的 JSON的主要内容,如果未能解决你的问题,请参考以下文章

如何快速解析这个特定的 json

如何使用 JSON.serializer 在 Swift 中解析 JSON

如何在 Swift 中解析 JSON 数组?

如何在 Swift 中访问 JSON 响应中的特定数据

如何在 swift 3 中解析 JSON

如何在swift 3中解析Json对象