ios - 使用 Codable 解码具有相似键的嵌套 JSON

标签 ios json swift codable

我正在尝试解码嵌套的 JSON。问题是顶级和嵌套键的名称相似。喜欢:

{
    success: bool
     message: String
     error: {
      message: String
         }
} 

我会从后端收到成功消息或失败消息。如果成功为真,则不会返回错误 key ,如果为假,则将错误与消息一起发送。

如果成功了:

{
    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"
         }
} 

关于ios - 使用 Codable 解码具有相似键的嵌套 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50620660/

相关文章:

ios - OpenCV for iOS 框架错误 "Base.hpp"header must be compiled as C++

ios - 将元数据添加到生成的音频文件

ios - 我的导航栏是透明的,现在消息应用导航栏也是透明的

javascript - 使用 ajax 请求中的 Json_encoded 数组重绘 Chart.js 图表

ios - 我正在尝试创建一个可扩展的 TableView ,其子元素具有 UICollectionView

ios - 使用自动布局在 ScrollView 中添加 uiimageview 会在顶部和底部添加空间

ios - 如何从 Xcode 8 中删除坏证书?

javascript - 从 JSON 文件中获取一组特定的键/值对

javascript - 使用 JavaScript 解析 JSON 树

ios - 如何在 Swift 中实现 Chartboost didCloseInterstitial