将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
抛出错误
无法将类型'__NSCFNumber'(0x21877a000)的值强制转换为 'NSString'(0x218788290)。
我也尝试了其他解决方案,但是没有用。
答案 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)
字符串插值对我有用! (首先将其转换为 String
不起作用,因为我有其他值,json 解码器 实际上 已完成其工作并将它们直接转换为数字)
if let responseMsg_any = responseMsg["requestId"],
let responseMsg_int = Int("\(responseMsg_any)") {
//..
}
此解决方案允许 any Type
成为 String
并检查 Int
值。仅当您不关心插值之前值的 Type
时才使用它。