gpt4 book ai didi

swift - 使用 JSONDecoder 解码数字 snake_case 键

转载 作者:行者123 更新时间:2023-11-28 07:25:17 28 4
gpt4 key购买 nike

我有以下 JSON 对象,要使用 JSONDecoder 将其转换为对象:

{
"first_key": 3,
"image_1000x1000": "location"
}

这映射到以下 Swift 模型:

struct Response: Decodable {
var firstKey: Int
var image1000x1000: String
}

通过将 JSONDecoder.convertFromSnakeCase 选项结合使用,JSON 中的 snake_case 键通过使用 the algorithm defined in the documentation 转换为 camelCase :

This strategy follows these steps to convert JSON keys to camel-case:

  1. Capitalize each word that follows an underscore.

  2. Remove all underscores that aren't at the very start or end of the string.

  3. Combine the words into a single string.

因此,在这种情况下:

  • first_key 变为 firstKey(如预期的那样)
  • image_1000x1000 应该变成 image1000x1000

但是,当尝试解码此响应时,将抛出 image1000x1000 键的 keyNotFound 错误 (see this live example):

let json = "{\"first_key\": 3, \"image_1000x1000\": \"location\"}".data(using: .utf8)!
do {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let response = try decoder.decode(Response.self, from: json)
print(response)
} catch let e {
print(e)
}

我的image_1000x1000驼峰式转换有什么不对,为什么JSONDecoder找不到对应的key?

最佳答案

您可以通过反向运行该过程来了解算法的预期;使用 JSONEncoder 对数据进行编码并检查输出:

struct Response: Codable {
var firstKey: Int
var image1000x1000: String
}

let test = Response(firstKey: 10, image1000x1000: "secondKey" )

let encoder = JSONEncoder()
encoder.keyEncodingStrategy = .convertToSnakeCase
let data = try encoder.encode(test)
print(String(data: data, encoding: .utf8)!)

这将产生:

{"first_key":10,"image1000x1000":"secondKey"}

因此,如果您可以控制 JSON 并且可以使用 image1000x1000 作为键,那么您就完成了。如果不是,你将不得不做这样的事情:

struct Response: Codable {
var firstKey: Int
var image1000x1000: String

private enum CodingKeys: String, CodingKey {
case image1000x1000 = "image_1000x1000"
case firstKey = "first_key"
}
}

另一种选择是实现自定义 key 编码策略。它最终可能会减少代码。参见 KeyEncodingStrategy有关更多信息。

关于swift - 使用 JSONDecoder 解码数字 snake_case 键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56782697/

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