为啥“数据”不是字典

Posted

技术标签:

【中文标题】为啥“数据”不是字典【英文标题】:Why is "data" not a dictionary为什么“数据”不是字典 【发布时间】:2016-01-28 10:07:11 【问题描述】:

我正在尝试解析我使用 SwiftyJSON 从 API 获取的 JSON,它给了我这个错误: Optional(Error Domain=SwiftyJSONErrorDomain Code=901 "Dictionary["data"] failure, It is not an dictionary" UserInfo=NSLocalizedDescription=Dictionary["data"] failure, It is not an dictionary)

JSON:


"status": 200,
"error": "",
"data": 
    "cursusses": [
        
            "cursus": 
                "curId": 1,
                "curNaam": "Lightroom Tips & Tricks",
                "catId": 1,
                "curInfo": "Praktische en korte Tips en Tricks om sneller en prettiger met Lightroom te kunnen werken.",
                "curThumbnail": "lr5-tips-en-tricks.jpg"
            
        ,
        
            "cursus": 
                "curId": 2,
                "curNaam": "Lightroom Fotobewerkingen",
                "catId": 1,
                "curInfo": "Per video wordt er in deze cursus een nabewerking uitgevoerd op een foto. Een leerzame manier om te zien hoe je in de praktijk foto's kunt nabewerken terwijl je daarnaast veel praktische tips krijgt over het gebruik van Lightroom 5.",
                "curThumbnail": "lr5-bewerkingen.jpg"
            
        ,
        
            "cursus": 
                "curId": 3,
                "curNaam": "Photoshop Fotobewerkingen",
                "catId": 2,
                "curInfo": "Per video wordt er in deze cursus een nabewerking uitgevoerd op een foto. Een leerzame manier om te zien hoe je in de praktijk foto's kunt nabewerken terwijl je daarnaast veel praktische tips krijgt over het gebruik van Photoshop.",
                "curThumbnail": "photoshop-cc.jpg"
            
        ,
        
            "cursus": 
                "curId": 4,
                "curNaam": "Basiscursus Lightroom 5",
                "catId": 1,
                "curInfo": "Leer de basisvaardigheden voor het werken met Adobe Photoshop Lightroom. Over het werken met catalogussen, importeren, het selectieproces, de nabewerking en het exporteren.",
                "curThumbnail": "basiscursus-lightroom-5.jpg"
            
        ,
        
            "cursus": 
                "curId": 5,
                "curNaam": "Photofacts Academy",
                "catId": 3,
                "curInfo": "Toelichting over het gebruiken van de Photofacts Academy website.",
                "curThumbnail": "photofacts-academy.jpg"
            
        ,
        
            "cursus": 
                "curId": 6,
                "curNaam": "Lightroom 5 web module",
                "catId": 1,
                "curInfo": "Met de Lightroom web module kun je eenvoudig van je foto's een online galerij maken.",
                "curThumbnail": "lr5-web-intro.jpg"
            
        ,
        
            "cursus": 
                "curId": 7,
                "curNaam": "Photoshop Tips & Tricks",
                "catId": 2,
                "curInfo": "Praktische tips voor het gebruik van Adobe Photoshop CC.",
                "curThumbnail": "photoshop-cc-splash.jpg"
            
        
    ]


我目前正在尝试使用这段代码来解析数据,这个函数在Alamofire请求的completionHandler中被调用:

func succesCurResponse(let response : Response<String, NSError>) 
    if let value = response.result.value 
        let json = JSON(value)
        let error = json["error"].stringValue
        print(json["data"].error)
        if(error.isEmpty) 
            for(var i = 0; i < json["data"]["cursusses"].count; i++) 
                let name = json["data"]["cursusses"][i]["cursus"]["curNaam"].stringValue
                let id = json["data"]["cursusses"][i]["cursus"]["curId"].intValue
                let catId = json["data"]["cursusses"][i]["cursus"]["catId"].intValue
                let info = json["data"]["cursusses"][i]["cursus"]["curInfo"].stringValue
                let thumbnail = json["data"]["cursusses"][i]["cursus"]["curThumbnail"].stringValue
                let newCur = Cursus()
                newCur.ID = id
                newCur.name = name
                newCur.info = info
                newCur.thumbnail = thumbnail
            
        
        else 
            print(error)
        
    

有什么建议吗?

【问题讨论】:

你试过let json = JSON(value) as! NSDictionary吗? 识别错误线将非常有帮助(对于您试图理解错误以及帮助您的人)。 @aaisataev Swift 发出警告说它是一个不相关的类型,所以转换总是会失败 另外,尝试在此处放置一些断点并快速查看json 以查看那里发生了什么。也许您需要在开始 for 循环之前将 json["data"] 转换为字典。 @NikolaiRuhe 它通常不会发出警告,它只是完全跳过 for 块,我在代码中添加了 print(json["data"].error) 以便我可以看到错误。 【参考方案1】:

抱歉,我不认识斯威夫特。但以下 Objective-C 代码将帮助您解决问题。

Objective-C:

NSArray *cursussesArray = json[@"cursusses"];

for (NSDictionary *singlecursusseDict in cursussesArray) 
    NSLog(@"%@", singlecursusseDict);

    NSDictionary *cursus = singlecursusseDict[@"cursus"];

我试试 Swift

let cursussesArray:NSArray = json[“cursusses”]

for singlecursusseDict: NSDictionary in cursussesArray 
    print(singlecursusseDict)
    cursusDict: NSDictionary = json[“cursus”]
    print(cursusDict)

【讨论】:

错误出现在data,而不是cursusses,并且无法将对象强制转换为NSArray,因此这不起作用。

以上是关于为啥“数据”不是字典的主要内容,如果未能解决你的问题,请参考以下文章

为啥 ArgumentParser 返回命名空间而不是字典? [关闭]

为啥检查字典是不是包含键会更快,而不是捕获异常以防万一?

为啥即使哈希函数可能不是 O(1),也要通过键 O(1) 访问字典的元素?

为啥这个循环比创建字典的字典理解更快?

为啥字典在 C# 中优于 Hashtable?

为啥python中字典的keys()以不同的顺序返回? [复制]