Swift recursive dictionary deep merge and clone

Swift
import Foundation

func deepClone(_ value: Any) throws -> Any {
    let data = try JSONSerialization.data(withJSONObject: value)
    return try JSONSerialization.jsonObject(with: data)
}

func deepMerge(_ base: [String: Any], _ patch: [String: Any]) -> [String: Any] {
    var result = base
    for (key, value) in patch {
        if let left = result[key] as? [String: Any],
           let right = value as? [String: Any] {
            result[key] = deepMerge(left, right)
        } else {
            result[key] = value
        }
    }
    return result
}