从 JSON 响应设置 NSDictionary 中的值

Posted

技术标签:

【中文标题】从 JSON 响应设置 NSDictionary 中的值【英文标题】:Setting the value in NSDictionary from JSON response 【发布时间】: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 中的相应键。

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

【问题讨论】:

【参考方案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 抛出此错误:表达式太复杂,无法在合理时间内解决;考虑将表达式分解为不同的子表达式

以上是关于从 JSON 响应设置 NSDictionary 中的值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NSDictionary 中访问本地 JSON 文件响应以在 UITableView 中显示?

JSON响应中NSDictionary内的对象数组-目标c

在 NSDictionary 上使用地图

从 JSON 获取的 NSData 的奇怪响应

将 JSON 数据从 NSData 转换为 NSDictionary

如何从 NSDictionary 获取整数值?