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/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 781b007..654f741 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/Source/Metadata.swift b/Source/Metadata.swift index 35d78b3..49fbd32 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, 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])) } } 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"