【问题标题】:Iterate over JSON and stored pointers in Swift在 Swift 中迭代 JSON 和存储的指针
【发布时间】:2020-02-05 12:01:00
【问题描述】:

从网络请求接收到JSON 有效负载后,我需要将数据解析为NSObject 子类中的变量。

我的变量在对象中声明:

var name:String?
var email:String?
var aboutMe:String?

然后我开始解析JSON 可能返回的所有可能数据:

if let name = json["Name"] as? String
{
    self.name = name
}
if let email = json["Email"] as? String
{
    self.email = email
}
if let aboutMe = json["AboutMe"] as? String
{
    self.aboutMe = aboutMe
}

这变得相当长,因为我们有很多数据。

我想通过使用包含JSON 键和variableDictionary 来缩短它,如下所示:

let varMap:[String:Any?] = [
   "Name": self.name,
   "Email": self.email,
   "AboutMe": self.aboutMe
]

然后像这样遍历它们:

for (key, var variable) in varMap
{
   if let string = json[key]
   {
      variable = string
   }
}

这里的问题是Dictionary从变量中复制值而不是指向它的指针,因此将其设置为新值对整个对象的变量没有影响。

有没有办法实现我正在尝试的目标?如果不是,还有什么其他模式比使用大量 if 语句更好?

【问题讨论】:

    标签: json swift loops dictionary pointers


    【解决方案1】:

    对于 JSON 解析,您可以简单地使用 Codable 类型。

    假设您的 JSON 看起来像,

    {
      "name": "Alex",
      "email": "alex@gmail.com",
      "about_Me": "My name is Alex"
    }
    

    型号:

    class Root: Decodable {
        let name: String?
        let email: String?
        let aboutMe: String?
    
        enum CodingKeys: String, CodingKey {
            case name, email
            case aboutMe = "about_Me"
        }
    }
    

    解析 JSON data 像这样,

    do {
        let response = try JSONDecoder().decode(Root.self, from: data)
        print(response) //use response here...
    } catch {
        print(error)
    }
    

    【讨论】:

    • 只有当 json 键名与变量名相同时才有效吗?
    • 如果不是,您可以在 Codable 类型中使用 CodingKeys 并指定您的自定义键名。我已经更新了答案以举例说明。
    【解决方案2】:

    您可以为此使用 updateValue 函数,它会找到属性并对其进行更改。

    if let oldValue = varMap.updateValue(self.name, forKey: "Name") {
        print("The old value of \(oldValue) was replaced with a new one.")
    }
    

    所以你的迭代是;

    for (key, var variable) in varMap
    {
       varMap.updateValue(string, forKey: key )
    
       //if let string = json[key]
       //{
       //   variable = string
       //}
    }
    

    更新字典后,您可以调用该部分;

    if let name = json["Name"] as? String
    {
        self.name = name
    }
    if let email = json["Email"] as? String
    {
        self.email = email
    }
    if let aboutMe = json["AboutMe"] as? String
    {
        self.aboutMe = aboutMe
    }
    

    我相信函数中的那个部分,如果不是,你可以重构它。

    https://developer.apple.com/documentation/swift/dictionary/3127179-updatevalue

    【讨论】:

    • 那是更新字典中的值。我想更新变量self.name中的值
    • 再次调用相同的代码怎么样?我更新了答案。
    • 我可以单独使用 if 语句,但我正在寻找一种更简洁的方法,即通过将变量名称映射到 json 名称。
    • 所以你可以检查 RxSwift、Codable 和 ObjectMapper,但我很困惑,你要求更新字典,现在你要求整理 if 语句。
    • 如果我的问题不清楚,我很抱歉。我通过使用if 语句检查每个json 键并将其分配给它的变量来展示我目前所做的事情。 json 键与变量名不同。我说它变得相当长,我试图通过在字典中分配 json 键和变量名并对其进行迭代来缩短函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多