如何将 __NSIArrayI' 转换为 Swift 中的 JSON 数组?

How to convert '__NSIArrayI' to JSON Array in Swift?

我是 Swift 4 的新手,正在研究 iOS app。我从 server 检索到以下 JSON 数据,这些数据将被提取到 data table

[
  {
    "fund_nav_validity":"24 August to 31 August 2016\n",
    "fund_nav_cost":10,
    "fund_nav_sell":9.85,
    "nav_id":118,
    "fund_nav_buy":10,
    "fund_id":1,
    "nav_as_on_date":"24-Aug-16",
    "fund_nav_market":9.95
  },
  {
    "fund_nav_validity":"04 September to 07 September 2016\n",
    "fund_nav_cost":10,
    "fund_nav_sell":9.85,
    "nav_id":117,
    "fund_nav_buy":10,
    "fund_id":1,
    "nav_as_on_date":"01-Sep-16",
    "fund_nav_market":9.95
 }
]

我在 navdata 函数中完成了以下任务,将“__NSIArrayI”检索到 JSON:

func getNAVData(){
        Alamofire.request(url, method: .post).responseJSON{
            response in
            if response.result.isSuccess{
                print("Success")
                //let navDataJSON : JSON = JSON(response.result.value!
                let navDataJSON : JSON = JSON(response.result.value!)

                print(navDataJSON)
            }else{
                print("Failed")
            }
        }

    }

我需要将其转换为 JSON Array,这是在 java 中完成的。如何在 Swift 4 中完成类似的任务?

你的方法是正确的,在这里你需要将你的 JSON 响应转换为数组你的 json 开始使用这种类型的原因 [{}] 并检查你的 JSON 响应最初包含或不包含值。试试下面的代码

 if response.result.isSuccess{
            print("Success")
            // convert your JSON to swiftyJSON array type if your JSON response as array as well as check its contains data or not
             guard let resJson = JSON(responseObject.result.value!).array ,  !resJson.isEmpty else { return
            }
            // create the Swifty JSON array for global access like wise
            var navDataJSON  =  [JSON]() //[JSON]() --> Swifty-JSON array memory allocation.
            navDataJSON =  resJson


        }

如果您想使用 SwiftyJSON return responseData 而不是 responseJSON。这避免了双重转换,并始终处理潜在的错误

func getNAVData(){
    Alamofire.request(url, method: .post).responseData { response in

        switch response.result {
            case .success(let data):
                 let navDataJSON = JSON(data).arrayValue
                 print(navDataJSON)                 

             case .failure(let error): print(error)
        }
    }
}

结果 navDataJSON 是一个 JSON 数组。


但是在 Swift 4+ 中,强烈建议使用更高效的内置 Codable 协议

struct Fund : Decodable {
    let fundNavValidity, navAsOnDate : String
    let fundNavCost, navId, fundNavBuy, fundId : Int
    let fundNavSell, fundNavMarket : Double
}

func getNAVData(){
    Alamofire.request(url, method: .post).responseData { response in

        switch response.result {
            case .success(let data):
                 do {
                     let decoder = JSONDecoder()
                     decoder.keyDecodingStrategy = .convertFromSnakeCase
                     let navDataJSON = decoder.decode([Fund].self, from : data)
                     print(navDataJSON)
                 } catch { print(error) }                 

             case .failure(let error): print(error)
        }
    }
}

结果是一个 Fund 结构数组。

您正在获取 JSON 数组,如果您想转换为模型数组,那么您可以使用创建模型结构并确认可解码协议,而无需使用 SwiftyJSON 使用内置解决方案来解析 JSON.

import Foundation

// MARK: - Element
struct Model: Decodable {
    let fundNavValidity: String
    let fundNavCost: Int
    let fundNavSell: Double
    let navId: Int
    let fundNavBuy: Int
    let fundId: Int
    let navAsOnDate: String
    let fundNavMarket: Double

    enum CodingKeys: String, CodingKey {
        case fundNavValidity = "fund_nav_validity"
        case fundNavCost = "fund_nav_cost"
        case fundNavSell = "fund_nav_sell"
        case navId = "nav_id"
        case fundNavBuy = "fund_nav_buy"
        case fundId = "fund_id"
        case navAsOnDate = "nav_as_on_date"
        case fundNavMarket = "fund_nav_market"
    }
} 

然后在 getNAVData 方法中,您可以使用 JSON解码器转换为模型结构数组,如下所示

func getNAVData() {
        Alamofire.request(url, method: .post).responseJSON {
            response in
            switch response.result {
            case .success(let data):
                do {
                    let modelArray = try JSONDecoder().decode([Model].self, from: data)
                    print(modelArray)
                } catch {
                    print("Error: \(error)")
                }
            case .failure(let error):
                print(error.localizedDescription)
            }
        }
    }