Как получить значение из массива JSON в Swift4 - PullRequest
0 голосов
/ 05 марта 2019

Я не могу получить значение json в переменную. Я печатаю значение, но проблема в том, что я не могу получить значение json без массива

вот мой json

{
"Categories": [
    "city",
    "delhi"
   ]
}

Я хочу, чтобы значение категории с массивом им значение печати с массивом

вот мой код

do{
            let json = try JSONSerialization.jsonObject(with: data!, options: []) as! [String: AnyObject]
            print(json as AnyObject)

            if let Categories = json["Categories"] {
                print(Categories)
            }

Ответы [ 4 ]

0 голосов
/ 05 марта 2019
//Model Class should be like this
struct JsonResposne : Codable {

    let categories : [String]?

    enum CodingKeys: String, CodingKey {
            case categories = "Categories"
    }

    init(from decoder: Decoder) throws {
            let values = try decoder.container(keyedBy: CodingKeys.self)
            categories = try values.decodeIfPresent([String].self, forKey: .categories)
    }

}

func getCategoriesResponse() {

Alamofire.request(requestUrl, method: .post, parameters: params, encoding: URLEncoding.default).responseJSON { (response) in
        switch response.result {
        case .success:
            if response.data != nil {
                do {
        let decoder = JSONDecoder()
        let apiResponse:JsonResponse = try decoder.decode(JsonResponse.self, from: responseData)
        print(apiResponse.categories.count)

    }catch {
        print(error.localizedDescription)
    }
                }
            }
            break
        case .failure:
            print("There was something with your call")
            break
        }
    }

}

0 голосов
/ 05 марта 2019

Сделайте вашу жизнь проще с Codable.Сначала создайте пользовательскую модель для вашего ответа

struct Response: Decodable {

    let categories: [String]

    enum CodingKeys: String, CodingKey {
        case categories = "Categories"
    }
}

Затем декодируйте ваш data, который вы получите, используя JSONDecoder

if let data = data {
    do {
        let decoded = try JSONDecoder().decode(Response.self, from: data)
        let string = decoded.categories.joined(separator: ", ") // if u need to join 
                                                                // your array to 
                                                                // single `String`
        print(string)
    } catch { print(error) }
}
0 голосов
/ 05 марта 2019

Использование встроенной быстрой поддержки для декодирования JSON путем соответствия Decodable, а также соответствия CustomStringConvertible для получения строкового представления значений

struct Item: Decodable, CustomStringConvertible {
    let categories: [String]

    enum CodingKeys: String, CodingKey {
        case categories = "Categories"
    }

    public var description: String {
        return categories.joined(separator: " ")
    }
}

let decoder = JSONDecoder()
do {
    let result = try decoder.decode(Item.self, from: data)
    let descr = result.description
    print(descr)
} catch {
    print(error)
}
0 голосов
/ 05 марта 2019

Вам нужно

 do {

     let json = try JSONSerialization.jsonObject(with: data!, options: []) as! [String:[String]]
      let arr1 = json["Categories"]!
      let str1 =  arr1.joined(separator: ":")
       print(str1)
     // or 
      let decoded = try JSONDecoder().decode(Root.self, from: data)
       let str =  decoded.categories.joined(separator: ":")
       print(str)

 } catch {
     print(error)
 }

или используйте

struct Root: Codable {
    let categories: [String] 
    enum CodingKeys: String, CodingKey {
        case categories = "Categories"
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...