You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS Swift中如何通过扩展处理JSON空值与空字符串?

在iOS Swift中批量检查并处理JSON的空字符串和Null值

嘿,我完全懂你现在的困扰——要处理上百个JSON字符串字段,逐个写判断逻辑不仅麻烦,还容易出错对吧?咱们可以通过封装通用工具方法的方式,一次性搞定所有空字符串、null甚至nil的情况,彻底告别重复代码。

先聊聊你当前代码的小问题

你现在分别处理空字符串和NSNull的逻辑虽然能工作,但有两个潜在隐患:

  • 用as! String强制解包,如果JSON字段的类型意外变化(比如本来是字符串突然变成数字),会直接导致崩溃
  • 重复的判断逻辑写几百次,代码冗余度太高,后续维护起来特别头疼

解决方案:封装通用处理函数

咱们先写一个工具函数,把所有的判断逻辑都封装进去,不管是nil、NSNull还是空字符串,都统一替换成你需要的默认值:

func sanitizeJSONValue(_ value: Any?, defaultValue: String = "---") -> String {
    // 处理nil的情况
    guard let unwrappedValue = value else {
        return defaultValue
    }
    
    // 处理JSON里的null(对应Swift里的NSNull)
    if unwrappedValue is NSNull {
        return defaultValue
    }
    
    // 处理空字符串
    if let stringValue = unwrappedValue as? String {
        return stringValue.isEmpty ? defaultValue : stringValue
    }
    
    // 如果是其他类型(比如数字、布尔值),可以转成字符串返回,或者按你的需求调整
    return String(describing: unwrappedValue)
}

批量处理字段的用法

有了这个函数,你只需要列出来需要处理的字段列表,循环调用函数就行,完美适配你上百个字段的场景:

假设你要处理hostel_info里的所有字段,先定义字段列表:

let hostelFields = ["e_residence", "district", "bed_name", "month", "institution_name", "board", "reg_no"]

然后循环处理每个字段:

// 假设permanentCAddVarDictionary是你解析后的JSON字典
for field in hostelFields {
    let cleanedValue = sanitizeJSONValue(permanentCAddVarDictionary?[field])
    self.permanentCAddDic.setValue(cleanedValue, forKey: field)
    // 如果是要给emergencyContactDic赋值,替换对应的字典即可
}

进阶:给字典写扩展,让代码更优雅

如果你想让调用更简洁,可以给Dictionary写一个扩展,这样代码看起来更清爽:

extension Dictionary where Key == String, Value == Any? {
    func sanitizedValue(forKey key: String, defaultValue: String = "---") -> String {
        guard let value = self[key] else {
            return defaultValue
        }
        
        if value is NSNull {
            return defaultValue
        }
        
        if let stringValue = value as? String {
            return stringValue.isEmpty ? defaultValue : stringValue
        }
        
        return String(describing: value)
    }
}

使用的时候就可以直接这样写:

let districtValue = permanentCAddVarDictionary.sanitizedValue(forKey: "district")
self.permanentCAddDic.setValue(districtValue, forKey: "district")

这样一来,不管你有多少个字段,都能快速处理,再也不用重复写判断逻辑啦!

内容的提问来源于stack exchange,提问作者Code92

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:01:24