首页 > 解决方案 > 无法快速从 JSON 中正确提取数据

问题描述

在将 json 字符串解析为对象后,我的响应中有一个这种 json 对象

[
    "requestId": 1, 
    "response": {
        code = SUCCESS;
    }, 
    "messageId": ACTION_COMPLETE
]

我正在尝试requestId使用

responseMsg["requestId"] as! Int

我收到此错误

无法将“NSTaggedPointerString”(0x21877a910)类型的值转换为“NSNumber”(0x218788588)。

我尝试将其更改为Int(responseMsg["requestId"] as! String)! This thing is working for positive numbers but not for negative numbers may be bcz when requestId = -2it throws me an error

无法将“__NSCFNumber”(0x21877a000)类型的值转换为“NSString”(0x218788290)。

我也尝试了不同的其他解决方案,但没有奏效。

标签: iosjsonswift

解决方案


对于解析JSON 数据,最好使用它Codable而不是手动解析所有内容。

对于JSON 格式

{
    "requestId": 1,
    "response": {
        "code":"SUCCESS"
    },
    "messageId": "ACTION_COMPLETE"
}

创建模型,例如,

struct Root: Decodable {
    let requestId: String?
    let messageId: String
    let response: Response

    enum CodingKeys: String, CodingKey {
        case requestId, messageId, response
    }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        if let id = try? values.decode(Int.self, forKey: .requestId) {
            requestId = String(id)
        } else if let id = try? values.decode(String.self, forKey: .requestId) {
            requestId = id
        } else {
            requestId = nil
        }
        messageId = try values.decode(String.self, forKey: .messageId)
        response = try values.decode(Response.self, forKey: .response)
    }
}

现在,使用解析JSON 数据

do {
    let root = try JSONDecoder().decode(Root.self, from: data)
    print(root.requestId) //access requestId like this....
} catch {
    print(error)
}

推荐阅读