From 0a62ff1722ae6ef7bf569edfa6ff465b86449857 Mon Sep 17 00:00:00 2001 From: Yunlong Zuo Date: Wed, 13 May 2020 15:20:25 +0800 Subject: [PATCH] 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"