サーバーからのJSON応答を含むData
オブジェクトがあります。私は戻ってData
にこのオブジェクトをENDCODE、その後Data
初期と比較したいテストの目的のためにコーディング可能な前後のJSONデータの比較
let object = try JSONDecoder().decode(Object.self, from: response.data)
:
は、それはいくつかのCodable
オブジェクトこのように変換されます。
let data = try JSONEncoder().encode(object)
第一の仮定:Data
オブジェクトがデコード+エンコード後に同じであれば、それはすべてのフィールドが正しく私のCodable
struct
に記載されていることを意味し、すべてのフィールドが有効なタイプとなどを持っている...変換した後、私は」 2つのData
オブジェクトがあります:154362バイト154435バイト。それは彼らが異なっていることを意味します。しかし、私がjsondiff.comを使ってそれらを比較すると、彼らは100%同一であるようです。
第2の仮定:データオブジェクトをStringに変換しようとしましたが、JSON構造体が別の方法でソートされました。このようには動作しません。
Double
/Float
の値にはいくつか問題があります。これらは復号化中にこのように解釈されます。41.01の結果は41.009999999になります。
質問:2つのJSONオブジェクトがデコード+エンコードの前後で同一であることを検証する方法はありますか?
現在のソリューション:
@available(iOS 11.0, *)
public static var sortedKeys: JSONSerialization.WritingOptions { get }
私は適切にソートされたJSONにData
を変換するこの方法は: iOSの11以来、それは偉大な書き込みオプションを持っているので、私はJSONSerialization
を試してみることにしまし
@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
}
}
2つのjson Data
オブジェクトを比較する信頼性の高い方法ですか?
「JSONEncoder/Decoder」は非常に制限的です。矛盾が発生するとエラーになります。操作が成功すると、データが正しく処理されたことを確認できます。入力/出力差は、浮動小数点値が関与する場合にのみ発生します。浮動小数点値の精度を制御する必要がある場合は、 'NumberFormatter'を使用してください。 – vadian
構造体にフィールドがなくても初期のjsonに存在する場合、エラーはスローされません – iWheelBuy