gpt4 book ai didi

json - Swift:检查数据响应是数组还是字典

转载 作者:行者123 更新时间:2023-11-28 14:57:30 24 4
gpt4 key购买 nike

我正在调用一个 API 并将数据存储在一个数组中。但如果没有数据,调试器会说:本应解码数组,但却发现了字典。

失败的 JSON 响应是:

    '{"status":"Failed","msg":"Sorry It\'s Not Working"}'

成功的 JSON 响应是:

'[{"id":"509","name":"TEC TEST !"#!12","sortingId":"1"},
{"id":"510","name":"TEC TEST !"#!12","sortingId":"2"},
{"id":"511","name":"TEC TEST !"#!12","sortingId":"3"},
{"id":"512","name":"TEC TEST !"#!12","sortingId":"4"},
{"id":"513","name":"TEC TEST !"#!12","sortingId":"5"},
{"id":"514","name":"TEC TEST !"#!12","sortingId":"6"},
{"id":"519","name":"TEC TEST !"#!12","sortingId":"7"}]'

所以我想在获取响应之间切换

var result:[Items]?

var result:Items?

如果发送失败的 JSON

我一直在 google´ing 和搜索 Stackoverflow,但运气不佳

是否有解决方案来判断 JSON 是数组还是字典?

我的结构:

struct Items: Codable {
let id: String?
let sortingId: String?
let name: String?
let response: String?
let status: String?
let msg: String?
}

我对响应的处理:

var result:[Items]?
result = try JSONDecoder().decode([Items].self, from: data!)
DispatchQueue.main.async {
for item in result! {
self.itemArray.append((name: item.name!, id: Int(item.id!)!, sortingId: Int(item.sortingId!)!))
}
}

最佳答案

一种解决方案是编写自定义初始化器,它有条件地解码数组或字典。

请请求服务的所有者发送更一致的 JSON。这很糟糕。至少该对象应该始终是一个字典,其中包含键 status 以及键 items 或键 msg 的数组>.

此代码首先尝试使用 unkeyedContainer 解码数组。如果失败,它会解码字典。

struct Item: Decodable {
let id: String
let sortingId: String
let name: String
}

struct ItemData : Decodable {

private enum CodingKeys: String, CodingKey { case status, msg }

let status : String?
let msg: String?
var items = [Item]()

init(from decoder: Decoder) throws {
do {
var unkeyedContainer = try decoder.unkeyedContainer()
while !unkeyedContainer.isAtEnd {
items.append(try unkeyedContainer.decode(Item.self))
}
status = nil; msg = nil
} catch DecodingError.typeMismatch {
let container = try decoder.container(keyedBy: CodingKeys.self)
status = try container.decodeIfPresent(String.self, forKey: .status)
msg = try container.decodeIfPresent(String.self, forKey: .msg)
}
}
}

然后调用它

result = try JSONDecoder().decode(ItemData.self, from: data!)

一个 - 可能更合适 - 替代方案是捕获 JSONDecoder().decode 行中的错误并使用两个简单的结构

struct Item: Decodable {
let id: String
let sortingId: String
let name: String
}

struct ErrorData : Decodable {
let status : String
let msg: String
}

并调用它

do {

let decoder = JSONDecoder()
do {
let result = try decoder.decode([Item].self, from: data!)
print(result)
} catch DecodingError.typeMismatch {
let result = try decoder.decode(ErrorData.self, from: data!)
print(result)
}
} catch { print(error) }

一个很大的好处是所有属性都可以是非可选的。

关于json - Swift:检查数据响应是数组还是字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49190777/

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