分享
三行代码  ›  专栏  ›  技术社区  ›  Rashedur Rahman

如何在swift中将'\uu nsiarrayi'转换为json数组? - How to convert '__NSIArrayI' to JSON Array in Swift?

  •  -3
  • Rashedur Rahman  · 技术社区  · 1 周前

    我是新来的 Swift 4 在一个 iOS app . 我有以下的 JSON 从中检索的数据 server 将提取到 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函数中完成了以下任务,以将'\u 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 . 如何在中执行类似的任务 斯威夫特4 ?

    2 回复  |  直到 1 周前
        1
  •  1
  •   Anbu.Karthik    1 周前

    在这里,您需要将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
    
    
            }
    
        2
  •  0
  •   Suhit Patil    1 周前

    您得到的是json数组,如果您想转换为model array,那么您可以使用create model struct和confirm to decodable protocol,而不必使用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方法中,可以使用jsondecoder转换为下面这样的结构数组模型

    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)
                }
            }
        }
    
        3
  •  0
  •   vadian    1 周前

    如果要使用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 结构。