我有Data
一个包含来自服务器的 JSON 响应的对象。
它以Codable
这种方式转换为某个对象:
let object = try JSONDecoder().decode(Object.self, from: response.data)
出于测试目的,我想将此对象结束编码Data
,然后与 initial 进行比较Data
。
let data = try JSONEncoder().encode(object)
第一个假设:如果Data
解码+编码后对象相等,则意味着所有字段都正确列在 my 中Codable
struct
,所有字段都具有有效类型等...转换后我有两个Data
对象:154362 字节 154435 字节。这意味着它们是不同的。但是当我使用jsondiff.com比较它们时,它们似乎是 100% 相同的。
第二个假设:我试图将数据对象转换为字符串,但 JSON 结构以不同的方式排序......所以这种方式不起作用。
Double
/Float
值存在一些问题。它们在解码过程中以这种方式解释:41.01结果为41.009999999。
所以问题是:有没有办法验证两个 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
}
}
这是比较两个jsonData
对象的可靠方法吗?