Вопрос получения значений JSON SWIFT Alamofire - PullRequest
0 голосов
/ 13 мая 2018

Я получаю ответ от сервера и преобразую его в NSDictionary.

Alamofire.request(URL, method: .post, parameters: parameters).responseJSON
        {
            response in

            if let result = response.result.value {
                let jsonData = result as! NSDictionary
                let recordJSON=jsonData.value(forKey: "records") as! NSDictionary
                let result = recordJSON.value(forKey: "result") as! NSArray
                print(result)

            }
    }

И теперь в результате значения равны

(
    {
    imagePath = "/SERVER/api/upload/geRsB.jpeg";
    propertyId = 11;
    userId = 5;
},
    {
    imagePath = "/SERVER/api/upload/RebJC.jpeg";
    propertyId = 14;
    userId = 5;
},
    {
    imagePath = "/SERVER/api/upload/fuM3F.jpeg";
    propertyId = 18;
    userId = 5;
}
)

Итак, теперьКак я могу получить дополнительные значения из каждого индекса результата (imagePath, propertyId, userId).

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 13 мая 2018

Вы должны использовать Codable или decodable для анализа ответа:

1: это структура для данных ответа

struct ImageData: Codable {
    let imagePath: String
    let propertyId: Int
    let userId: Int
}

2: Тогдаиспользуйте эту структуру для синтаксического анализа данных:

Alamofire.request(URL, method: .post, parameters: parameters).responseJSON
        { response in

    if let result = response.result.value {
       let jsonData = try JSONSerialization.data(withJSONObject: result, options: JSONSerialization.WritingOptions.prettyPrinted)
       let myStruct = try JSONDecoder().decode([ImageData].self, from: jsonData)
                print(result)

         }
    }

3: Затем вы можете использовать результат первого анализа этого объекта следующим образом:

let imagePath = myStruct[0].imagePath
let propertyId = myStruct[0].propertyId
let userId = myStruct[0].userId

ИлиВы можете напрямую использовать без разбора вот так:

   for data in result  {

      if let innerData = data as? [String:Any] {
        let imagePath = innerData["imagePath"]
        let propertyId = innerData["propertyId"]
        let userId = innerData["userId"]
     }
  }
0 голосов
/ 13 мая 2018

Если ваш ответ подобен этому

[
  {
    "imagePath": "/SERVER/api/upload/geRsB.jpeg",
    "propertyId": 11,
    "userId": 5
  },
  {
    "imagePath": "/SERVER/api/upload/geRsB.jpeg",
    "propertyId": 11,
    "userId": 5
  }
]

Вы можете использовать кодируемый протокол вот так

import Foundation

typealias Users = [UserElement]

struct UserElement: Codable {
    let imagePath: String
    let propertyID, userID: Int

    enum CodingKeys: String, CodingKey {
        case imagePath
        case propertyID = "propertyId"
        case userID = "userId"
    }
}

// MARK: Convenience initializers

extension UserElement {
    init(data: Data) throws {
        self = try JSONDecoder().decode(UserElement.self, from: data)
    }
}

extension Array where Element == Users.Element {
    init(user data: Data) throws {
        self = try JSONDecoder().decode(Users.self, from: data)
    }
}

Затем используйте это в запросе

 Alamofire.request(URL, method: .post, parameters: parameters).response
            {
                response in
               guard let data = response.data else {return}
                let users = try? Array.init(user:data)
        }
0 голосов
/ 13 мая 2018

Я рекомендую использовать Decodable, но в вашем случае вы можете попробовать

 if let result = response.result.value as? [String:Any] {

    if let recordJSON = result["records"] as? String:Any] {

       if let result = recordJSON["result"] as?  [Any] {

            print(result)

             for item in result  {

                   if let inner = item as? [String:Any] {

                       print(inner["imagePath"])

                       print(inner["propertyId"])

                       print(inner["userId"])

                   }

             }
        }
    }
}
...