From ae918a379c398566bdd3a9464d7c56bf04d9e083 Mon Sep 17 00:00:00 2001 From: tigerenwork Date: Mon, 29 Jun 2026 00:30:51 +0800 Subject: [PATCH] fix: remove redundant CodingKeys conflicting with .convertFromSnakeCase MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- Sources/Services/Feishu/FeishuModels.swift | 28 +++------------------- 1 file changed, 3 insertions(+), 25 deletions(-) diff --git a/Sources/Services/Feishu/FeishuModels.swift b/Sources/Services/Feishu/FeishuModels.swift index f99e18e..586f8cf 100644 --- a/Sources/Services/Feishu/FeishuModels.swift +++ b/Sources/Services/Feishu/FeishuModels.swift @@ -16,27 +16,16 @@ struct RecordListData: Decodable { struct RecordItem: Decodable { let recordId: String let fields: [String: JSONValue] - - enum CodingKeys: String, CodingKey { - case recordId = "record_id" - case fields - } } struct OAuthTokenData: Decodable { + // Note: decoder uses .convertFromSnakeCase, so JSON keys are auto-mapped: + // access_token→accessToken, token_type→tokenType, expires_in→expiresIn, etc. let accessToken: String let tokenType: String? let expiresIn: Int let refreshToken: String? 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 { @@ -44,23 +33,12 @@ struct TenantAccessTokenData: Decodable { let msg: String let tenantAccessToken: String let expire: Int - - enum CodingKeys: String, CodingKey { - case code - case msg - case tenantAccessToken = "tenant_access_token" - case expire - } } struct UserInfoData: Decodable { let name: String? + // en_name → enName via .convertFromSnakeCase let enName: String? - - enum CodingKeys: String, CodingKey { - case name - case enName = "en_name" - } } enum JSONValue: Decodable {