проверить ответ json это массив или int или строка для ключа? - PullRequest
0 голосов
/ 01 мая 2018

У меня ответ json, в котором ключ "products" иногда имеет значение int, а в некоторых случаях - массив? Как проверить, имеет ли он массив или Int?

"products": 25

или

"products": [77,80,81,86]

Я использую это

self.productsCount = mResp["products"] as! [Int]

но он падает каждый раз, когда у него нет массива.

Теперь я не понимаю, как это проверить, потому что у меня есть разные опции для Int и Array?

Пожалуйста, помогите мне. Спасибо

Ответы [ 6 ]

0 голосов
/ 01 мая 2018
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")

}
0 голосов
/ 01 мая 2018

Нет необходимости возвращаться к 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]
0 голосов
/ 01 мая 2018

Общее решение будет таким,

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)
}
0 голосов
/ 01 мая 2018

Это временное решение, как вы хотите. Проверьте возможный тип с типом «Любой».

    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")
    }
0 голосов
/ 01 мая 2018

Это происходит сбой, потому что вы принудительно разворачиваете как Целочисленный Массив, даже если у вас просто есть целое число. Решение заключается в проверке обоих:

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
}
0 голосов
/ 01 мая 2018

давайте предположим, что ваше имя 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...