From 0a62ff1722ae6ef7bf569edfa6ff465b86449857 Mon Sep 17 00:00:00 2001 From: Yunlong Zuo Date: Wed, 13 May 2020 15:20:25 +0800 Subject: [PATCH 1/4] add support convert from snake case --- Source/Configuration.swift | 2 ++ Source/ExtendCustomModelType.swift | 10 ++++++++++ .../BasicTypesInStructTestsFromJSON.swift | 16 ++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/Source/Configuration.swift b/Source/Configuration.swift index f7c4f2e..48a0ed6 100644 --- a/Source/Configuration.swift +++ b/Source/Configuration.swift @@ -25,6 +25,8 @@ public struct DeserializeOptions: OptionSet { public let rawValue: Int public static let caseInsensitive = DeserializeOptions(rawValue: 1 << 0) + + public static let convertFromSnakeCase = DeserializeOptions(rawValue: 1 << 1) public static let defaultOptions: DeserializeOptions = [] diff --git a/Source/ExtendCustomModelType.swift b/Source/ExtendCustomModelType.swift index fbe7289..3d97298 100644 --- a/Source/ExtendCustomModelType.swift +++ b/Source/ExtendCustomModelType.swift @@ -30,6 +30,16 @@ fileprivate func convertKeyIfNeeded(dict: [String: Any]) -> [String: Any] { newDict[key.lowercased()] = value }) return newDict + } else if HandyJSONConfiguration.deserializeOptions.contains(.convertFromSnakeCase) { + var newDict = [String: Any]() + dict.forEach({ (kvPair) in + let (key, value) = kvPair + let result = key.split(separator: "_").reduce("") {(acc, name) in + "\(acc)\(acc.count > 0 ? String(name.capitalized) : String(name))" + } + newDict[result] = value + }) + return newDict } return dict } diff --git a/Tests/HandyJSONTests/BasicTypesInStructTestsFromJSON.swift b/Tests/HandyJSONTests/BasicTypesInStructTestsFromJSON.swift index f13eee6..9376375 100644 --- a/Tests/HandyJSONTests/BasicTypesInStructTestsFromJSON.swift +++ b/Tests/HandyJSONTests/BasicTypesInStructTestsFromJSON.swift @@ -112,6 +112,22 @@ class BasicTypesInStructTestsFromJSON: XCTestCase { XCTAssertEqual(mappedObject?.anyObjectOptional as? Int, value2) XCTAssertEqual(mappedObject?.anyObjectImplicitlyUnwrapped as? Double, value3) } + + func testMappingAnyObjectFromJSONByConvertFromSnakeCase() { + HandyJSONConfiguration.deserializeOptions = .convertFromSnakeCase + defer { + HandyJSONConfiguration.deserializeOptions = .defaultOptions + } + let value1 = "STRING" + let value2: Int = 1234 + let value3: Double = 11.11 + let JSONString = "{\"any_object\" : \"\(value1)\", \"any_object_optional\" : \(value2), \"any_object_implicitly_unwrapped\" : \(value3)}" + let mappedObject = BasicTypesInStruct.deserialize(from: JSONString) + XCTAssertNotNil(mappedObject) + XCTAssertEqual(mappedObject?.anyObject as? String, value1) + XCTAssertEqual(mappedObject?.anyObjectOptional as? Int, value2) + XCTAssertEqual(mappedObject?.anyObjectImplicitlyUnwrapped as? Double, value3) + } func testMappingStringFromNSStringJSON(){ let value: String = "STRINGNGNGG" From 58fc08ae53f0eb4d83e2f85b2d6118d000b1a726 Mon Sep 17 00:00:00 2001 From: Miles Date: Fri, 8 Mar 2024 17:41:20 +0800 Subject: [PATCH 2/4] fix xcode15 archive failed --- HandyJSON.xcodeproj/project.pbxproj | 12 ++++++------ Source/Metadata.swift | 11 +++++++---- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/HandyJSON.xcodeproj/project.pbxproj b/HandyJSON.xcodeproj/project.pbxproj index 7913ee0..507a225 100644 --- a/HandyJSON.xcodeproj/project.pbxproj +++ b/HandyJSON.xcodeproj/project.pbxproj @@ -1323,7 +1323,7 @@ ENABLE_BITCODE = NO; INFOPLIST_FILE = "$(SRCROOT)/Source/Info-iOS.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.aliyun.app.HandyJSON; PRODUCT_NAME = "$(PROJECT_NAME)"; @@ -1347,7 +1347,7 @@ ENABLE_BITCODE = NO; INFOPLIST_FILE = "$(SRCROOT)/Source/Info-iOS.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.aliyun.app.HandyJSON; PRODUCT_NAME = "$(PROJECT_NAME)"; @@ -1366,7 +1366,7 @@ DEVELOPMENT_TEAM = QBMN2BBW3K; ENABLE_BITCODE = NO; INFOPLIST_FILE = HandyJSONDemo/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.aliyun.app.HandyJSONDemo; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1386,7 +1386,7 @@ DEVELOPMENT_TEAM = QBMN2BBW3K; ENABLE_BITCODE = NO; INFOPLIST_FILE = HandyJSONDemo/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.aliyun.app.HandyJSONDemo; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1402,7 +1402,7 @@ BUNDLE_LOADER = "$(TEST_HOST)"; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = "Tests/HandyJSONTests/Info-iOS.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.aliyun.app.HandyJSONTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1417,7 +1417,7 @@ BUNDLE_LOADER = "$(TEST_HOST)"; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = "Tests/HandyJSONTests/Info-iOS.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.aliyun.app.HandyJSONTests; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/Source/Metadata.swift b/Source/Metadata.swift index 35d78b3..b644d00 100755 --- a/Source/Metadata.swift +++ b/Source/Metadata.swift @@ -290,11 +290,14 @@ extension Metadata { var name: String? var type: Any.Type? } - for i in 0.. Any.Type?] = [ + "function": { _getTypeByMangledNameInContext(cMangledTypeName, UInt(getMangledTypeNameSize(cMangledTypeName)), genericContext: self.contextDescriptorPointer, genericArguments: self.genericArgumentVector) } + ] + if let function = functionMap["function"],let fieldType = function() { result.append(Property.Description(key: name, type: fieldType, offset: fieldOffsets[i])) } } From 19a0709972c1c9d9c29cbe1547979e3389151fc4 Mon Sep 17 00:00:00 2001 From: Miles Date: Thu, 19 Sep 2024 21:07:25 +0800 Subject: [PATCH 3/4] Update Metadata.swift Fix the issue of Xcode 16 UI build failure --- Source/Metadata.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Metadata.swift b/Source/Metadata.swift index b644d00..49fbd32 100755 --- a/Source/Metadata.swift +++ b/Source/Metadata.swift @@ -295,7 +295,7 @@ extension Metadata { let cMangledTypeName = fieldRecords[i].mangledTypeName! let functionMap: [String: () -> Any.Type?] = [ - "function": { _getTypeByMangledNameInContext(cMangledTypeName, UInt(getMangledTypeNameSize(cMangledTypeName)), genericContext: self.contextDescriptorPointer, genericArguments: self.genericArgumentVector) } + "function": { _getTypeByMangledNameInContext(cMangledTypeName, getMangledTypeNameSize(cMangledTypeName), genericContext: self.contextDescriptorPointer, genericArguments: self.genericArgumentVector) } ] if let function = functionMap["function"],let fieldType = function() { result.append(Property.Description(key: name, type: fieldType, offset: fieldOffsets[i])) From de8a7126d2270da55cea3cb45dadffcfd002dbbe Mon Sep 17 00:00:00 2001 From: Miles Date: Thu, 19 Sep 2024 21:08:48 +0800 Subject: [PATCH 4/4] Fix the issue of Xcode 16 UI build failure Fix the issue of Xcode 16 UI build failure