我有json响应,其中“products”键有时具有int值,有些情况下它有一个数组? 如何检查它是否有数组或Int?
"products": 25
或
"products": [77,80,81,86]
我正在使用此
self.productsCount = mResp["products"] as! [Int]
但每次没有数组时都会崩溃。
现在我没有得到如何检查这个,因为我对Int和Array有不同的选项?
请帮助我。谢谢
答案 0 :(得分:4)
它崩溃是因为你强制解包为整数数组,即使你只有一个整数。解决方案是检查两者:
self.productsCount = mResp["products"] as? [Int] ?? mResp["products"] as? Int
其他解决方案
if let proCount = mResp["products"] as? [Int] {
self.productsCount = proCount
} else {
self.productsCount = mResp["products"] as? Int
}
答案 1 :(得分:4)
这是您想要的临时解决方案。使用“任何”类型检查可能的类型。
var anyType : Any!
anyType = "123"
anyType = ["Test","Test1"]
anyType = 1
if anyType is NSArray {
print("is NSArray")
}else if anyType is String {
print("is String")
}else if anyType is Int {
print("is Int")
}
答案 2 :(得分:3)
这里没有必要回到Any
。即使是有问题的JSON也可以使用Codable
来处理。你只需要继续尝试不同的类型,直到有人工作。
struct Thing: Decodable {
let products: [Int]
enum CodingKeys: String, CodingKey {
case products
}
init(from decoder: Decoder) throws {
// First pull out the "products" key
let container = try decoder.container(keyedBy: CodingKeys.self)
do {
// Then try to decode the value as an array
products = try container.decode([Int].self, forKey: .products)
} catch {
// If that didn't work, try to decode it as a single value
products = [try container.decode(Int.self, forKey: .products)]
}
}
}
let singleJSON = Data("""
{ "products": 25 }
""".utf8)
let listJSON = Data("""
{ "products": [77,80,81,86] }
""".utf8)
let decoder = JSONDecoder()
try! decoder.decode(Thing.self, from: singleJSON).products // [25]
try! decoder.decode(Thing.self, from: listJSON).products // [77, 80, 81, 86]
答案 3 :(得分:2)
让我们假设您的json名称为jsonData
检查Int
和Array Int
:
if let intVal = jsonData["products"] as? Int {
print("Products is a Integer: ", intVal)
} else if let jsonArr = jsonData["products"] as? [Int] {
var intVals = [Int]()
for json in jsonArr {
intVals.append(json)
}
print("Json is array of Int: ", intVals)
}
答案 4 :(得分:2)
let dict = [77,80,81,86]//Pass your parameter or parsed json value
if dict is Array<Any> {
print("Yes, it's an Array")
}
else{
print("NO, it's not an Array")
}
答案 5 :(得分:1)
通用解决方案就是这样,
let products = mResp["products"] as? Any
if let item = products as? [Int] {
print("array", item)
} else if let item = products as? Int {
print("Integer", item)
}
答案 6 :(得分:0)
使用Generics
获得更好的解决方案,并在解码此模型时提供类型。
struct Product<T: Codable>: Codable {
let products: T?
}
您可以将其与嵌套try catch
一起使用:
do {
let product = try JSONDecoder().decode(Product<Int>.self, from: data)
print(product)
} catch {
do {
let product = try JSONDecoder().decode(Product<[Int]>.self, from: data)
print(product)
} catch {
print(error)
}
}
注意:此解决方案假定可编码结构中不超过几个不同的类型更改属性。如果存在多个类型变化的属性,我建议使用接受的答案中提供的自定义init(decoder:)
,而不是使用try-catch
树,这将是更好的设计。