gpt4 book ai didi

ios - 如何在 swift 2 中解析未知的 json 数据类型

转载 作者:搜寻专家 更新时间:2023-11-01 06:19:54 24 4
gpt4 key购买 nike

从 api 获取数据时,我可以得到产品数组或带有错误的字典的响应,例如

如果一切顺利,api 会发送一系列产品:

[
"Product1":
{
name = "someting",
price = 100,
discount = 10%,
images = [image1,image2]
},
"Product2":
{
name = "someting",
price = 100,
discount = 10%,
images = [image1,image2]
}
]

但是如果发生某些错误,它会发送带有错误消息和代码的字典:

{
error_message = "message"
error_code = 202
}

我正在使用这段代码将 JSON 数据转换为数组:

do {
let jsonDict = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSArray{
//Some code....
} catch let error as NSError {
print("JSON Error: \(error.localizedDescription)")
}

但是如果我得到错误作为字典它崩溃。

问题:1、如何判断接收到的数据是数组还是字典?2. 有时甚至键或值都可能丢失,因此检查值会变得非常冗长,例如:

if let productsArray = jsonObject as? NSArray{
if let product1 = productsArray[0] as? NSDictionary{
if let imagesArray = product1["image"] as? NSArray{
if let imageUrl = imagesArray[0] as? String{
//Code ....
}
}
}
}

我读到关于 guard 关键字来减少 if 条件,但我不清楚如何在这里使用。

最佳答案

问题 1:对于 try catch,添加一个 if let 以将对象转换为 NSDictionary 或 NSArray,例如:

 do {
let jsonObject = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers)
if let jsonDict = jsonObject as? NSDictionary {
// Do smthg.
}
if let jsonArray = jsonObject as? NSArray {
// Do smthg.
}
}catch {
//...
}

对于问题 2:我认为 guard 不会帮助你。它在其 else 语句中需要像 return/break 这样的 smthg。如果您不想在其中一个值不可用时抛出您的方法,则必须使用这种冗长的 if let 代码样式。也许在您的情况下,最佳做法是为具有可选属性的产品设置数据模型。

Class product {
var name:String?
var image:[NSData]? // maybe UIImage or smthg.
var price:Int?
var discount:Int?

init(jsonDic:NSDictionary){
// if it's not there it would be nil
self.name = jsonDic["name"] as? String
self.image = jsonDic["image"] as? NSArray
self.discount = jsonDic["discount"] as? Int
self.price = jsonDic["price"] as? Int
}
}

现在您可以使用您的数据加载这些模型,而无需 if let 等。但是,如果您想读取这些值,则必须使用 if let 进行 checkin (如果它不为零)。对于你的情况下的 init 它应该是这样的:将其添加到 do catch block 的 if let 语句中 ( ... as? NSArray//DO smthg. )

for item in jsonArray {
guard let jsonDic = item as? NSDictionary else { return }
// if you dont know every key you can just iterate through this dictionary
for (_,value) in jsonDic {
guard let jsonDicValues = value as? NSDictionary else { return }
productArray.append(Product(jsonDic: jsonDicValues)
}
}

正如我所说,当从模型中读取时知道你得到了整个 if let 的东西,而不是在写入时(读取 json)

关于ios - 如何在 swift 2 中解析未知的 json 数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35831804/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com