【问题标题】:How to compare two JSON objects in Swift?如何在 Swift 中比较两个 JSON 对象?
【发布时间】:2022-01-03 11:00:50
【问题描述】:

我有一个 json 对象并将其存储为 initialData 并在进行一些更改后将 json 对象存储到另一个 modifiedData 中。现在我正在尝试比较 initialData 和 modifiedData 的两个 json 对象,但我无法比较它。

注意:这里的json对象是动态值。

示例代码:

let jsonObjectVal = JSON(message.body)
let initialData = jsonObjectVal

在保存操作中我修改了数据对象。

 let jsonObjectModVal = JSON(message.body)
 let modifiedData = jsonObjectModVal

 if initialFormDataJson == jsonObjectVal {
     print("json object are equal save handler")
   } else  {      
     print("json object are not equal save handler")
   }

任何帮助都非常感谢...

【问题讨论】:

  • 您必须创建一个模型类,它可以同时接受 json 对象并逐个比较所有组件
  • 这个 JSON 类型是从哪里来的?如果你运行你的代码,实际会发生什么?
  • @ShivamParmar 在我的例子中 json 是动态对象。
  • @Sven Json 类型来自 webview javascript userContentController postMessage.
  • 也许你不需要直接回答这个问题,但是你应该学习如何在 swift 中使用 json 时使用Codable

标签: ios json swift xcode dictionary


【解决方案1】:

这是一个随机数据结构的示例,说明您可以如何做到这一点:

import Foundation

final class YourObject: Decodable, Equatable {

    var field1: String
    var field2: Int
    var field3: [String : Double]

    static func == (lhs: YourObject, rhs: YourObject) -> Bool {
        lhs.field1 == rhs.field1
            && lhs.field2 == rhs.field2
            && lhs.field3 == rhs.field3
    }

}

let firstJSONString = """
{
   "field1":"Some string",
   "field2":1,
   "field3":{
      "Some string":2
   }
}
"""
let firstJSONData = firstJSONString.data(using: .utf8)!
let firstObject = try? JSONDecoder().decode(YourObject.self, from: firstJSONData)

let secondJSONString = """
{
   "field1":"Some string",
   "field2":1,
   "field3":{
      "Some string":2
   }
}
""" // Same.
let secondJSONData = secondJSONString.data(using: .utf8)!
let secondObject = try? JSONDecoder().decode(YourObject.self, from: secondJSONData)

let thirdJSONString = """
{
   "field1":"Some other string",
   "field2":2,
   "field3":{
      "Some string":3
   }
}
""" // Differs.
let thirdJSONData = thirdJSONString.data(using: .utf8)!
let thirdObject = try? JSONDecoder().decode(YourObject.self, from: thirdJSONData)

print(firstObject == secondObject) // true
print(firstObject == thirdObject) // false

注意:您提到对象应该是动态的,这就是为什么它是class。如果你需要一个值对象,你可以使用struct,避免手动实现==operator。

当然,这只是一个开始。有了特定的 JSON 结构,您就可以随时搜索更复杂的示例,互联网上蜂拥而至。

【讨论】:

    【解决方案2】:

    从 JSON 创建一个 NSObject 类或结构并比较所有属性以检查是否相等并相应地返回 true/false。 Equatable 协议将在这里派上用场。

    class A: Equatable {
        func equalTo(rhs: A) -> Bool {
            // whatever equality means for two As
        }
    }
    
    func ==(lhs: A, rhs: A) -> Bool {
        return lhs.equalTo(rhs)
    }
    

    【讨论】:

    • 如何在我的代码上实现这个?
    • 按照本教程创建模型。 JSON-Model。然后使用 Equatable 比较您的模型。
    【解决方案3】:

    对于比较 2 个对象,请使用 === 运算符

    例如。

    let jsonObjectModVal = JSON(message.body)
     let modifiedData = jsonObjectModVal
    
     if initialFormDataJson === jsonObjectVal {
         print("json object are equal save handler")
       } else  {      
         print("json object are not equal save handler")
       }
    

    【讨论】:

    • 试过这个不行
    • 它显示错误。参数类型“JSON”应为类或类约束类型的实例
    猜你喜欢
    • 2017-11-29
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多