【问题标题】:Setting the value in NSDictionary from JSON response从 JSON 响应设置 NSDictionary 中的值
【发布时间】:2016-08-26 06:26:37
【问题描述】:

我已经解析了 JSON 数据,现在在将 JSON 设置为我的NSDictionary 时,JSON 中的某些键可能不存在。我想检查解析给我的 JSON 中是否存在密钥,如果没有,请将空白字段设置为 `NSDictionary' 对象中的密钥的值。

jsonData = ["id": ((json["idnumber"]) as? String!)!,
          "Name": ((json["name"]) as? String!)!,
   "Roll Number": ((json["rollnumber"]) as? String!)!,
         "Class": ((json["class"]) as? String!)!,
         "Marks": ((json["marks"]) as? String!)!,
        "Gender": ((json["gender"]) as? String!)!]

因此,在上述情况下,标记字段可能存在也可能不存在于 JSON 中。我想检查一下并将相应的值分配给jsonData 中的相应键。

我尝试使用“??”,但是编译时间很长。

【问题讨论】:

    标签: ios json swift xcode nsdictionary


    【解决方案1】:

    您可以使用if letguard 进行有条件的可选包装。

    var jsonData = [String : String]
    if let num = json["idnumber"]) as? String {
        jsonData["id"] = num
    }
    else {
        jsonData["id"] = num
    }
    

    等等。

    编辑:你也可以这样尝试。

    var id = name = rollNum = class = ""
    if let num = json["idnumber"]) as? String {
        id = num
    }
    if let sname = json["name"]) as? String {
        name = sname
    }
    ...
    

    然后最后创建Dictionary

    var jsonData = ["id": id, "name": name, ...]
    

    【讨论】:

    • 效果很好。但是有没有替代方法来优化代码。考虑到我有 35 到 40 个这样的字段,那么对于每个字段我需要编写这 4 行代码。
    【解决方案2】:

    如果存在则可以设置值,否则为空白字符串 ("")。这将防止崩溃。试试下面的代码:-

            let idValue = dictionary["idnumber"] as? String ?? ""
            let name = dictionary["name"] as? String ?? ""
            let rollNumber = dictionary["rollnumber"] as? String ?? ""
            let className = dictionary["class"] as? String ?? ""
            let marks = dictionary["marks"] as? String ?? ""
            let gender = dictionary["gender"] as? String ?? ""
    
            let jsonDic : NSMutableDictionary = NSMutableDictionary()
            jsonDic.setObject(idValue, forKey: "id")
            jsonDic.setObject(name, forKey: "name")
            jsonDic.setObject(className, forKey: "class")
            jsonDic.setObject(rollNumber, forKey: "rollNumber")
            jsonDic.setObject(marks, forKey: "marks")
            jsonDic.setObject(gender, forKey: "gender")
    

    【讨论】:

    • 我尝试了你给出的解决方案。 “??”的问题是它需要大量的编译时间。我有30多个领域。即使您使用 10 个“??”该项目无法编译。
    • “??”的存在和数量代码中的运算符不应显着影响编译时间,并且其中许多运算符不会阻止您的代码编译。听起来您的 Xcode 设置可能有问题。你用的是什么版本?
    • 我试过 jsonData = ["id": ((json["idnumber"]) as?String!)! ?? " ", "Name": ((json["name"]) as?String!)! ?? " "] Xcode7.3 抛出此错误:表达式太复杂,无法在合理时间内解决;考虑将表达式分解为不同的子表达式
    猜你喜欢
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多