从具有特定结构的 json 解码数据时出现问题

Posted

技术标签:

【中文标题】从具有特定结构的 json 解码数据时出现问题【英文标题】:Problem decoding data from json with a specific structure 【发布时间】:2021-07-08 18:26:25 【问题描述】:

我正在尝试解码此响应数据:


  "headers": ,
  "original": 
      "code": 201,
      "success": true,
      "message": "Message"
  ,
  "exception": null

使用这个结构:

struct MarcaAguaResData: Codable 
    let original: Marca


struct Marca: Codable 
    let code: Int
    let success: Bool
    let message: String

我只关心原创内容。使用我正在实现的代码,使用 JSONDecoder,我得到了这个错误:

failure(Swift.DecodingError.keyNotFound(CodingKeys(stringValue: "code", intValue: nil), Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "Index 0", intValue: 0)], debugDescription: "No value associated with key CodingKeys(stringValue: \"code\", intValue: nil) (\"code\").", underlyingError: nil)))

【问题讨论】:

我无法通过简单的复制和粘贴来确认这一点。但是,我可以看到您的 json 格式不正确("success": true 之后缺少逗号)。它与错误不匹配,但您可以考虑更正它 那是我的错误。我更正了问题 问题基本上是:我应该使用什么结构来解码 JSON 数据? 您提供的结构适合解码您提供的 json。错误必须是另一个错误 你的 json 响应中有一个元素还是多个元素? 【参考方案1】:

首先让我说您提供的 JSON 和您提供的 Codable 工作正常

但是,当您收到此特定错误时:

failure(Swift.DecodingError.keyNotFound(CodingKeys(stringValue: "code", intValue: nil), Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "Index 0", intValue: 0)], debugDescription: "没有与键 CodingKeys 关联的值(stringValue: "code", intValue: nil) ("code").", underlyingError: nil)))

这只是意味着你的服务器没有发送你一直期待的 JSON,所以基本上在这个错误中你的服务器正在向你发送这种 JSON:


  "headers": ,
  "original": 
      "success": true,
      "message": "Message"
  ,
  "exception": null

“代码”在 JSON 中完全缺失。

如果您在结构中将 code 标记为可选,则可以避免出现错误并且仍然可以让您的代码正常工作:

struct Marca: Codable 
    let code: Int?
    let success: Bool
    let message: String

【讨论】:

以上是关于从具有特定结构的 json 解码数据时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

在另一个项目中读取JSON文件时出现问题

使用 FFmpeg API 加载 G.729 解码器时出现问题

如何使用具有数组的 2 个结构解码 JSON

如何使用 Codable 解码具有更改键的 json 响应?

如何从数据库特定的选定值添加到解码的 Json 数组

尝试在已用 Java 编码的 JS 中解码 Base64 时出现“要解码的字符串未正确编码”错误