【问题标题】:The JSON output does not contain a key: "value"JSON 输出不包含键:“值”
【发布时间】:2017-07-26 04:23:33
【问题描述】:

我在下面的 Swift 代码中有一个 JSON 解析问题。我收到的错误是我的JSON 输出不包含密钥value

我的代码:

 Alamofire.request(url, method: .get, headers: headers).responseJSON { (response) -> Void in

     let jsonValue = response.result.value as! NSDictionary
     if let bpArray = jsonValue["value"] as? [NSDictionary]{
         for  results in bpArray {...}

问题: 此转换不起作用:if let bpArray = jsonValue["value"] as? [NSDictionary]

我的 JSON 结构:

{
    d: {
        results: [
            {
                __metadata: {},
                Key: "AFBWhULFHtKU4j4FhWCmKg==",
                ParentKey: "AAAAAAAAAAAAAAAAAAAAAA==",
                RootKey: "AFBWhULFHtKU4j4FhWCmKg==",
                Partner: "MM-CARR-01",
                Type: "2",
                Description: "MM Demo Carrier Created for Single Stop / MA",
                FrieghtOrder: {}
            },
        ...

【问题讨论】:

  • 到底发生了什么?错误、nil 值等
  • JSON 输出不包含密钥 value
  • 看你的JSON对象,貌似它,其实没有任何名为“value”的属性。

标签: json swift parsing nsdictionary


【解决方案1】:

假设您想访问结果键,请尝试这样:-

if let bpArray = jsonValue["results"] as? [String: AnyObject]{
//yourcode
}

【讨论】:

  • 谢谢,这个想法很神奇。是的,就像大多数人说的“值”不存在一样,我没有直接使用结果,我必须从 d->results 导航,如下所示: if let bpData = jsonValue["d"] as? [String: AnyObject]{ 对于 bpData 中的结果 { let arrayInterim = results.value as? NSArray for i in 0 ..
  • 如果您觉得有帮助,请采纳答案
【解决方案2】:

嗯,你的 json 结构没有任何名为 value 的键,这就是它给出错误的原因。
为了获取结果数组,您首先需要获取它们嵌套的对象,例如 'g' 在您的情况下:

if let data = jsonValue["d"] as? [NSDictionary]{
     if let resultsArray = data["results"] as? NSArray {
         //your code
     }
}

【讨论】:

    【解决方案3】:

    请使用 Swifty Json Pod 并尝试此代码

    pod 'SwiftyJSON'
    

    在您收到回复的文件中

    import  SwiftyJSON
    

    然后在使用此代码后

             switch response.result {
                case .success(let JSON2):
                print("Success with JSON: \(JSON2)")
                  //  print("Request failed with error: \(response.response?.statusCode)")
    
                    if let response = JSON2 as? NSMutableDictionary
                    {
    
                    }
                    else if let response = JSON2 as? NSDictionary
                    {
     if let data = response?.object(forKey: "d") as? NSDictionary
     {
        if let resultsArray = data?.object(forKey: "results") as? NSArray 
            {
    
             }
     }
                    }
                    else if JSON2 is NSArray
                    {
    
                        let swjson = JSON(response.result.value!)
                        print(swjson)
                        // callback(swjson,nil)
                        var myMutableDictionary = [AnyHashable: Any]()
                        myMutableDictionary["myArray"] = swjson
    
                        callback(myMutableDictionary as NSDictionary?,nil)
                        print("accc")
                    }
                    else if ((JSON2 as? String) != nil)
                    {
    
                        let userDic : [String : String] = ["quatid":JSON2 as! String]
                        print(userDic)
    
    
                }
    
                    break
    
                case .failure(let error):
                    print("Request failed with error: \(error)")
    
                }
    

    【讨论】:

      【解决方案4】:

      请记住,我们最好不要使用 NSArrayNSDictionary 之类的 SWIFTSWIFT 它为各种数据类型自行提供 letvar 关键字。 首先,您可以创建可以保存数据的模型。

      MyModel.swift

      class MyModel: NSObject {
          var ParentKey : Int?
      
          init(jsonObject:[String:Any]) {
              ParentKey = jsonObject["ParentKey"] as? String ?? ""
        }
      }
      

      Viewcontroller.Swift

          var myModel : [MyModel] = []
          if let responseData = response["d"] as? [String:Any]{
                    if let dataObject = responseData["results"] as? [[String:Any]]{
                       self.myModel = dataObject.map({return MyModel(jsonObject: $0)})//for assigning data into model
                      }
             }
      

      【讨论】:

        【解决方案5】:

        正如大多数人所说,我对“价值”的理解是错误的。 Hussain 对使用 [String:AnyObject] 帮助的回答。

        我不确定以下是否可以很好地实现,但它确实很神奇。应用程序按预期加载。下面是代码专家:

        解决方案:

                if let bpData = jsonValue["d"] as? [String: AnyObject]{
        
                    for results  in bpData {
        
                        let arrayInterim = results.value as? NSArray
        
                        for i in 0 ..< arrayInterim!.count {
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-01-06
          • 1970-01-01
          • 1970-01-01
          • 2016-12-04
          • 1970-01-01
          • 2013-02-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多