ios - 使用 Codable 解码具有相似键的嵌套 JSON
问题描述
我正在尝试解码嵌套的 JSON。问题是顶层和嵌套键的名称相似。喜欢:
{
success: bool
message: String
error: {
message: String
}
}
从后端我会收到一条成功消息或一条失败消息。如果成功为真,则不会返回错误键,如果为假,则将错误与消息一起发送。
所以如果成功:
{
success: true
message: "Success message"
}
如果失败:
{
success: false
error:{
message: "Failed message"
}
}
以上将是返回的json。这是我的解码结构:
struct loginResponse : Codable{
var success: Bool
var success_message: String
var error_message: String
enum loginResponseKeys: String, CodingKey{
case success
case error
case success_message = "message" // raw value is not unique
case error_message = "message"
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: loginResponseKeys.self)
let error = try container.nestedContainer(keyedBy: loginResponseKeys.self, forKey: .error)
error_message = try error.decode(String.self, forKey: .error_message)
let message = try container.decode(String.self, forKey:.success_message)
}
没错,它说原始值不是唯一的。但是我该如何克服呢?
解决方案
您可以为 ErrorMessage 创建结构
struct LoginResponse: Codable {
let success: Bool
let message: String?
let error: ErrorMessage?
}
struct ErrorMessage: Codable {
let message: String?
}
extension LoginResponse {
init(data: Data) throws {
self = try JSONDecoder().decode(LoginResponse.self, from: data)
}
}
假设这个 Json:
{
"success": true,
"message": "success",
"error": {
"message": "Error Message"
}
}
推荐阅读
- android-recyclerview - ReactiveUI - 流之间的动态数据切换到单个 ReadOnlyObservableCollection
- typescript - 泛型函数的 TypeScript 条件返回类型
- azure - 机器人频道注册 - Azure 机器人框架
- c - 为什么 srand (time (NULL)) 的 NULL 给 time () 一个随机值?
- python - Selenium find_element_by_id - 提取临时元素 ID
- string - 使用 Ansible 在正则表达式匹配行的末尾附加一个字符串
- scala - 如何处理spark sql数据框中的json列数组
- android - 调用 setOnClickListener() 时出现空指针异常
- reactjs - 如何使用 React-Redux 和 Axios 获取加载组件上的数据?
- android - 使用 Firebase MLkit 库时有没有办法获取 BarCode 格式名称?