比较Codable转换之前和之后的JSON数据

时间:2017-10-26 06:29:24

标签: json swift swift4 nsjsonserialization codable

我有Data对象,其中包含来自服务器的JSON响应。

它以这种方式转换为某个Codable对象:

let object = try JSONDecoder().decode(Object.self, from: response.data)

出于测试目的,我想将此对象重新编码回Data,然后与初始Data进行比较。

let data = try JSONEncoder().encode(object)

第一个假设:如果解码+编码后Data个对象相等,则表示我的Codable struct中所有字段都已正确列出字段有有效的类型等...转换后我有两个Data对象:154362字节154435字节。这意味着他们是不同的。但是当我使用jsondiff.com比较它们时,它们看起来是100%相同的。

第二个假设:我试图将Data对象转换为String,但是JSON结构以不同的方式排序......所以这种方式不起作用。

Double / Float值存在一些问题。它们在解码过程中以这种方式解释: 41.01 导致 41.009999999

所以问题是:有没有办法在decode + encode之前和之后验证两个JSON对象是否相同?

当前解决方案:我决定尝试JSONSerialization,因为自iOS 11以来它有一个很棒的写作选项:

@available(iOS 11.0, *)
public static var sortedKeys: JSONSerialization.WritingOptions { get }

这样我将Data转换为正确排序的json:

@available(iOS 11, *)
private extension Data {

    static func equal(json1: Data, json2: Data) -> Bool {
        return json1.serialized == json2.serialized
    }

    var serialized: Data? {
        guard let json = try? JSONSerialization.jsonObject(with: self) else {
            return nil
        }
        guard let data = try? JSONSerialization.data(withJSONObject: json, options: [.sortedKeys, .prettyPrinted]) else {
            return nil
        }
        return data
    }
}

这是比较两个json Data对象的可靠方法吗?

1 个答案:

答案 0 :(得分:2)

我已经创建了一个小的 iOS11 https://company.org/sites/js/prj/Lists/GetByTitle('St%20Codes)/items(insert_ID_here)扩展名,这有助于我比较JSON对象并查找任何两个JSON对象开始不匹配的第一行。

Data