fix: remove redundant CodingKeys conflicting with .convertFromSnakeCase

JSONDecoder.keyDecodingStrategy = .convertFromSnakeCase converts JSON keys
like 'tenant_access_token' to Swift names like 'tenantAccessToken'. Having
explicit CodingKeys that map to the ORIGINAL snake_case keys (e.g.,
case tenantAccessToken = "tenant_access_token") causes a collision:
the decoder first converts the JSON key, then looks for a CodingKey
matching the original name — but the converted name doesn't match.

Removed redundant CodingKeys from OAuthTokenData, TenantAccessTokenData,
UserInfoData, and RecordItem. .convertFromSnakeCase handles all these
mappings automatically.

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
tigerenwork 2026-06-29 00:30:51 +08:00
parent f1ef89ef55
commit ae918a379c
1 changed files with 3 additions and 25 deletions

View File

@ -16,27 +16,16 @@ struct RecordListData: Decodable {
struct RecordItem: Decodable { struct RecordItem: Decodable {
let recordId: String let recordId: String
let fields: [String: JSONValue] let fields: [String: JSONValue]
enum CodingKeys: String, CodingKey {
case recordId = "record_id"
case fields
}
} }
struct OAuthTokenData: Decodable { struct OAuthTokenData: Decodable {
// Note: decoder uses .convertFromSnakeCase, so JSON keys are auto-mapped:
// access_tokenaccessToken, token_typetokenType, expires_inexpiresIn, etc.
let accessToken: String let accessToken: String
let tokenType: String? let tokenType: String?
let expiresIn: Int let expiresIn: Int
let refreshToken: String? let refreshToken: String?
let refreshExpiresIn: Int? let refreshExpiresIn: Int?
enum CodingKeys: String, CodingKey {
case accessToken = "access_token"
case tokenType = "token_type"
case expiresIn = "expires_in"
case refreshToken = "refresh_token"
case refreshExpiresIn = "refresh_expires_in"
}
} }
struct TenantAccessTokenData: Decodable { struct TenantAccessTokenData: Decodable {
@ -44,23 +33,12 @@ struct TenantAccessTokenData: Decodable {
let msg: String let msg: String
let tenantAccessToken: String let tenantAccessToken: String
let expire: Int let expire: Int
enum CodingKeys: String, CodingKey {
case code
case msg
case tenantAccessToken = "tenant_access_token"
case expire
}
} }
struct UserInfoData: Decodable { struct UserInfoData: Decodable {
let name: String? let name: String?
// en_name enName via .convertFromSnakeCase
let enName: String? let enName: String?
enum CodingKeys: String, CodingKey {
case name
case enName = "en_name"
}
} }
enum JSONValue: Decodable { enum JSONValue: Decodable {