如何检查json返回值是数组还是字典的形式

Posted

技术标签:

【中文标题】如何检查json返回值是数组还是字典的形式【英文标题】:How to check if json return value is in the form of an array or a dictionary 【发布时间】:2017-11-15 23:04:04 【问题描述】:

我正在使用 swift 4 处理从 URLSession 调用返回的 json。调用后,使用 URL 字符串作为键,将 json 保存到字典(类型缓存)中。然后我想将 json 处理为一个名为 ApodJSON 的自定义对象。有时返回的 json 是我的 ApodJSON 对象的数组,有时它是单个 ApodJSON。

当我使用 swift 的新 JsonDecoder images = try JSONDecoder().decode([ApodJSON].self, from: data) 时,如果 json 之前的代码返回一个 individual 对象,我会收到一条错误消息,即“预期解码 Array 但找到了字典。”

我如何检查 json 数据是 array 的 json 数据还是 dictionary 格式的单个项目,以允许我调用适当的 JSONDecoder 方法。以下检查数据是否为数组不起作用

    // parse json to ApodJSON class object if success true
func processJSON(success: Bool) 
    // get the data stored in cache dic and parse to json
    // data is of type Data
    guard let data = self.dataForURL(url: self.jsonURL), success == true else  return 
    do 
        var images: [ApodJSON] = []
        // check if data is an array of json image data or an indiviual item in dictionary format
        if data is Array<Any> 
            images = try JSONDecoder().decode([ApodJSON].self, from: data)
         else 
            let image = try JSONDecoder().decode(ApodJSON.self, from: data)
            images.append(image)
        
        for image in images 
            print("ImageUrls: \(String(describing: image.url))")
        
     catch let jsonError 
        print(jsonError)
    

【问题讨论】:

【参考方案1】:
func processJSON(success: Bool) 
     // get the data stored in cache dic and parse to json
     // data is of type Data
     guard let data = self.dataForURL(url: self.jsonURL), success == true else  return 
     var images: [ApodJSON] = []
     do 
       // try to decode it as an array first
         images = try JSONDecoder().decode([ApodJSON].self, from: data)
         for image in images 
            print("ImageUrls: \(String(describing: image.url))")
         
      catch let jsonError 
        print(jsonError)
        //since it didn't work try to decode it as a single object
        do
           let image = try JSONDecoder().decode(ApodJSON.self, from: data)
           images.append(image)
         catch let jsonError
           print(jsonError)
        
     

【讨论】:

是的,谢谢。不确定是否有其他方法可以预先检查,但这实现了我想要做的事情

以上是关于如何检查json返回值是数组还是字典的形式的主要内容,如果未能解决你的问题,请参考以下文章

如何检查json数据数组是不是返回值

如何检查键值是字符串还是整数(ios,Android)

接口返回值中数组中包含多个json对象形式

SELECT语句返回值是啥类型?

如何在 Swiftyjson 中检查值是日期字符串还是双精度值?

Python 字典 items() 方法