2017-07-26 60 views
2

我有一个JSON解析问题,我的Swift代码如下。我得到的错误说我的JSON输出不包含密钥valueJSON输出不包含密钥:“值”

我的代码:

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: {} 
      }, 
     ... 
+0

究竟是怎么回事?错误,'nil'值等。 – ZGski

+0

JSON输出不包含键'值' – vadian

+0

看着你的'JSON'对象,它看起来像它,实际上并没有任何名为“value”的属性。 – ZGski

回答

1

假设您湾吨至访问结果键,以便尝试这样的: -

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

谢谢,这个想法做到了神奇。是的,像大多数人所说的“价值”不存在,我没有直接使用结果,我必须从d->结果导航,如下所示: if let bpData = jsonValue [“d”] as? [String:AnyObject] { for bpData { let arrayInterim = results.value as? NSArray 我在0 .. Selvakumar

+0

如果您认为它有帮助,那么请接受答案 –

+0

完成,谢谢你的一个有用的建议。 – Selvakumar

1

嗯,你的JSON结构还没有得到命名为价值的关键,这就是为什么它给了一个错误。
为了得到结果阵列,您首先需要获取该对象在它们被嵌套,并针对你的情况例如'g'

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

请使用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)") 

      } 
0

记住它的更好,我们不会使用NSArray & NSDictionary喜欢的东西在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 
       } 
     } 
0

正如许多人说,我是错的 “价值”。侯赛因的答案使用[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 {