diff --git a/Sources/XXClient/Helpers/ConvertJsonNumberToString.swift b/Sources/XXClient/Helpers/ConvertJsonNumberToString.swift new file mode 100644 index 0000000000000000000000000000000000000000..293f1ca640c4c69fc3e3958329b51671ff6b3508 --- /dev/null +++ b/Sources/XXClient/Helpers/ConvertJsonNumberToString.swift @@ -0,0 +1,19 @@ +import Foundation + +func convertJsonNumberToString( + in input: Data, + at key: String +) -> Data { + guard var string = String(data: input, encoding: .utf8) else { + return input + } + string = string.replacingOccurrences( + of: #""\#(key)"( *):( *)([0-9]+)( *)(,*)"#, + with: #""\#(key)"$1:$2"$3"$4$5"#, + options: [.regularExpression] + ) + guard let output = string.data(using: .utf8) else { + return input + } + return output +} diff --git a/Tests/XXClientTests/Helpers/ConvertJsonNumberToStringTests.swift b/Tests/XXClientTests/Helpers/ConvertJsonNumberToStringTests.swift new file mode 100644 index 0000000000000000000000000000000000000000..db3a4b2edc77a81ae493a03b9294389ff7c6a203 --- /dev/null +++ b/Tests/XXClientTests/Helpers/ConvertJsonNumberToStringTests.swift @@ -0,0 +1,84 @@ +import CustomDump +import XCTest +@testable import XXClient + +final class ConvertJsonNumberToStringTests: XCTestCase { + func testConverting() { + assert( + input: #"{"number":1234567890,"text":"hello"}"#, + key: "number", + expected: #"{"number":"1234567890","text":"hello"}"# + ) + + assert( + input: #"{"text":"hello","number":1234567890}"#, + key: "number", + expected: #"{"text":"hello","number":"1234567890"}"# + ) + + assert( + input: #"{ "number" : 1234567890 , "text" : "hello" }"#, + key: "number", + expected: #"{ "number" : "1234567890" , "text" : "hello" }"# + ) + + assert( + input: #"{ "text" : "hello" , "number" : 1234567890 }"#, + key: "number", + expected: #"{ "text" : "hello" , "number" : "1234567890" }"# + ) + + assert( + input: """ + { + "number": 1234567890, + "text": "hello" + } + """, + key: "number", + expected: """ + { + "number": "1234567890", + "text": "hello" + } + """ + ) + + assert( + input: """ + { + "text": "hello", + "number": 1234567890 + } + """, + key: "number", + expected: """ + { + "text": "hello", + "number": "1234567890" + } + """ + ) + } +} + +private func assert( + input: String, + key: String, + expected: String, + file: StaticString = #file, + line: UInt = #line +) { + XCTAssertNoDifference( + String( + data: convertJsonNumberToString( + in: input.data(using: .utf8)!, + at: key + ), + encoding: .utf8 + )!, + expected, + file: file, + line: line + ) +}