无法迅速从JSON正确提取数据

时间:2019-07-11 09:15:20

标签: ios json swift

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

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

我正在尝试使用

提取requestId
responseMsg["requestId"] as! Int

我收到此错误

  

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

我尝试将其更改为Int(responseMsg["requestId"] as! String)!requestId = -2抛出错误

时,此东西适用于正数,但不适用于负数bcz
  

无法将类型'__NSCFNumber'(0x21877a000)的值强制转换为   'NSString'(0x218788290)。

我也尝试了其他解决方案,但是没有用。

4 个答案:

答案 0 :(得分:2)

要解析 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)
}

答案 1 :(得分:0)

尝试

Int(String(describing: responseMsg["requestId"]))!

这确保所有数据先转换为字符串,然后转换为int

答案 2 :(得分:0)

此错误消息

Could not cast value of type 'NSTaggedPointerString' (0x21877a910) to 'NSNumber' (0x218788588).

告诉我们JSON请求ID被解析为字符串。 NSTaggedPointerString是ObjC运行时使用的特殊内部类型,用于表示字符串。

尝试一下:

let requestId = responseMsg["requestId"] as! String
print("request id: \(requestId)") // Prints a string

注意,它可能打印出看起来像数字的东西,但不是一个。

您正在解析的JSON看起来像

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

请注意引号中的1

答案 3 :(得分:0)

斯威夫特 5

字符串插值对我有用! (首先将其转换为 String 不起作用,因为我有其他值,json 解码器 实际上 已完成其工作并将它们直接转换为数字)

if let responseMsg_any = responseMsg["requestId"], 
   let responseMsg_int = Int("\(responseMsg_any)") {
   //..
}

警告:

此解决方案允许 any Type 成为 String 并检查 Int 值。仅当您不关心插值之前值的 Type 时才使用它。