首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >快速JSONDecoder -不使用下划线的编码键

快速JSONDecoder -不使用下划线的编码键
EN

Stack Overflow用户
提问于 2019-04-23 17:16:22
回答 2查看 3.6K关注 0票数 3

请有人解释一下为什么A部分的代码可以工作,而B部分不能。这让我很困惑。

工作

代码语言:javascript
运行
复制
struct Coded : Codable, Hashable {  
  public let avar1: String
  public let avar2: String

  enum CodingKeys: String, CodingKey {
    case avar1 = "avar1"
    case avar2 = "avar2"
  }

  init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: CodingKeys.self)
    print (container.allKeys)
    avar1 = try container.decode(String.self, forKey: .avar1)
    avar2 = try container.decode(String.self, forKey: .avar2)
  }
}

let JSONStr = """
{
  "avar1": "This is a string",
  "avar2": "This is a string2",
}
"""

if let jsdata = JSONStr.data(using: .utf8) {
  let decoder = JSONDecoder()
  decoder.keyDecodingStrategy = .convertFromSnakeCase
  let aobj: Coded? = try? decoder.decode(Coded.self, from: jsdata)
  print (aobj ?? "No object")
}

输出

代码语言:javascript
运行
复制
[CodingKeys(stringValue: "avar1", intValue: nil), CodingKeys(stringValue: "avar2", intValue: nil)]
Coded(avar1: "This is a string", avar2: "This is a string2")

不工作

代码语言:javascript
运行
复制
struct Coded : Codable, Hashable {  
  public let avar1: String
  public let avar2: String

  enum CodingKeys: String, CodingKey {
    case avar1 = "avar1"
    case avar2 = "avar_2"
  }

  init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: CodingKeys.self)
    print (container.allKeys)
    avar1 = try container.decode(String.self, forKey: .avar1)
    avar2 = try container.decode(String.self, forKey: .avar2)
  }
}

let JSONStr = """
{
  "avar1": "This is a string",
  "avar_2": "This is a string2",
}
"""

if let jsdata = JSONStr.data(using: .utf8) {
  let decoder = JSONDecoder()
  decoder.keyDecodingStrategy = .convertFromSnakeCase
  let aobj: Coded? = try? decoder.decode(Coded.self, from: jsdata)
  print (aobj ?? "No object")
}

输出

代码语言:javascript
运行
复制
[CodingKeys(stringValue: "avar1", intValue: nil)]
No object

第二个函数只显示没有下划线的编码键。但一旦我删除下划线,它在allKeys中有编码键.

SWIFT4.2- Xcode 10.2。

有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2019-04-26 15:25:11

.convertFromSnakeCase在snake_cased访问CodingKeys之前将变量转换为camelCase

如果要指定CodingKeys,则必须在不工作的示例中使用转换后的值。

代码语言:javascript
运行
复制
enum CodingKeys: String, CodingKey {
    case avar1 = "avar1"
    case avar2 = "avar2"
}

但这说明了CodingKeys毫无意义。因此,从另一个角度考虑,并利用关键的解码策略。

而不是删除.convertFromSnakeCase,移除CodingKeys和初始化器。

Decoding 错误.

代码语言:javascript
运行
复制
struct Coded : Codable {
    public let avar1: String
    public let avar2: String
}

let jsonStr = """
{
"avar1": "This is a string",
"avar_2": "This is a string2",
}
"""

let jsdata = Data(jsonStr.utf8)
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
do {
    let aobj = try decoder.decode(Coded.self, from: jsdata)
    print(aobj)
} catch { print(error) }
票数 4
EN

Stack Overflow用户

发布于 2019-04-23 17:54:10

我已经解决了这个问题。它源于Snake案例中出现的一个问题。在某些情况下,可能会引起问题。他们是为什么发生的,我不确定。但是,如果您有一个JSONDecoder与蛇的情况下,启动启动。它将删除使用蛇壳编码的项的KeyCodings。

通过从我的JSONDecoder中删除下面的内容,我能够修复这个问题。

请删除下面的代码字符串,并强制编码字符串到蛇的情况,如果您有此参数集,并强制您的JSONDecoder策略与.convertFromSnakeCase,它将删除编码的关键字符串,并将在解码期间中断。

如果您的编码键包括

代码语言:javascript
运行
复制
codingKey = "a_json_var"

如果添加convertFromSnakeCase,这将完全删除编码键。因此,不要在您的编码关键字大小写中指定一个文本字符串,否则它将中断。

删除->

代码语言:javascript
运行
复制
decoder.keyDecodingStrategy = .convertFromSnakeCase

如果要正确指定确切的编码键文本名称,请执行以下操作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55816336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档