如何检查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返回值是数组还是字典的形式的主要内容,如果未能解决你的问题,请参考以下文章