我有以下代码的json数据:
{
"all": [
{
"ModelId": 1,
"name": "ghe",
"width": 2
},
{
"ModelId": 2,
"name": "ban",
"width": 3
}]
}
我尝试获取modelId
并将其转换为String但它不能使用我的代码:
let data = NSData(contentsOf: URL(string: url)!)
do {
if let data = data, let json = try JSONSerialization.jsonObject(with: data as Data) as? [String: Any], let models = json["all"] as? [[String:Any]] {
for model in models {
if let name = model["ModelId"] as? String {
_modelList.append(name)
}
}
}
completion(_modelList)
}catch {
print("error")
completion(nil)
}
如何解决这个问题?谢谢。
我认为ModelId
是整数类型。那么,你可以尝试将它转换为Integer
for model in models {
if let name = model["ModelId"] as? Int{
_modelList.append("\(name)")
}
}
希望,它会帮助你。
if let as?
是打开包装,而不是打字。所以你首先解开,然后把它投入到字符串中。
for model in models {
if let name = model["ModelId"] as? Int {
_modelList.append("\(name)")
}
}
目前你正在寻找一个错误的钥匙,
for model in models {
if let name = model["ModelId"] as? NSNumber {
_modelList.append(name.stringValue)
}
}
只要您使用JSONSerialization.jsonObject
来解析您的JSON,您几乎无法控制反序列化器将创建的类型,您基本上让解析器决定。这是明智的,它将从没有引号的数字创建NSNumber
类型的“某种”Int
。这不能转换为String
,因此您的程序将失败。
你可以做不同的事情以“解决”这个问题,我想建议用于JSON解析的Codable
协议,但是这个特定的问题可能只能使用一个看起来有点冗长的自定义初始化器来解决,如下所示this question。
如果你只想将你的NSNumber
ModelId
转换为String
,你将不得不创建一个新对象(而不是试图徒劳无功)。在您的上下文中,这可能只是
if let name = String(model["ModelId"]) { ...
这仍然不是一个优雅的解决方案,但它将解决手头的问题。