我们能让可编码密钥不区分大小写吗?

struct Model: Codable, Equatable {
let number: String?
let id: String?
let address: String?

enum CodingKeys: String, CodingKey {
case number = "A-Number"
case id = "A-Id"
case address = "AddressId"
}
}

因此它适用于两种json:

Sample Json 1
{
"A-Number" : "12345",
"A-Id" : "1",
"AddressId" : "3456"
}

Sample Json 2
{
"a-number" : "12345",
"a-id" : "1",
"addressid" : "3456"
}

推荐答案

使用下面的代码将密钥设置为小写,以便在整个应用程序中使用.

struct AnyKey: CodingKey {
      var stringValue: String

      init?(stringValue: String) {
        self.stringValue = stringValue
      }

      var intValue: Int? {
        return nil
      }

      init?(intValue: Int) {
        return nil
      }
    }
    
    struct DecodingStrategy {
        static var lowercase: ([CodingKey]) -> CodingKey {
            return { keys -> CodingKey in
                let key = keys.first!
                let modifiedKey = key.stringValue.prefix(1).lowercased() + key.stringValue.dropFirst()
                return AnyKey(stringValue: modifiedKey)!
            }
        }
    }

要使用此选项:

let jsonDecoder = JSONDecoder()
jsonDecoder.keyDecodingStrategy = .custom(DecodingStrategy.lowercase)
let dataModel = try jsonDecoder.decode(YourDataModel, from: yourdata)

Ios相关问答推荐

更新Flutter项目时出错:CocoaPods找不到pod webview_flutter_wkwebview的兼容版本""

使用CGAffineTransform旋转视图只起作用一次吗?

在许多UIButton中对齐文本,即使SF Symbols(或其他图像)具有不同的宽度?

无法在所有窗口上方显示图像

如何通过S定义的对象设置删除基于块的观察者的测试?

检测touch 并忽略其他手势SWIFT SceneKit

无法添加以供审阅-Xcode 15.0.1

安装新版本 XCode 15.0 后无法运行应用程序 XCode

RFID scanner 的蓝牙服务 UUID?

如何结合`@dynamicMemberLookup`和`ExpressibleByStringInterpolation`来实现方法链?

具有线性渐变的 SVG textPath 在 Safari 中损坏

工具栏底部 iOS 16 - SwiftUI

使用 Apollo 发布 iOS 应用程序时缺少推送通知权利

在 Swift 中映射 MySQL 数据

如何将 iPhone OSStatus 代码转换为有用的东西?

Xcode 10.2 无法在 iOS < 10 的模拟器上运行应用程序

NSURLSession:如何增加 URL 请求的超时时间?

文本未包含在 swift UI 中

在 SKScene 中设置按钮

zoom UIButton 动画 - Swift