SwiftyJSON解析通知数据时的字段取值异常问题咨询
解决SwiftyJSON解析时单独取键返回null的问题
我之前确实碰到过一模一样的SwiftyJSON解析问题!明明打印整个JSON对象时数据都正常,但单独取某个键却返回null,大概率是这几个原因导致的:
可能的原因
- 键名拼写/大小写错误:JSON的键名是区分大小写的,比如实际后端返回的是
"Status"而不是你写的"status",或者键名里有隐藏的空格、特殊字符,打印整个JSON时可能因为格式问题看不出来,导致单独取值失败。 - JSON结构层级错误:有时候
status并不是直接在根节点,而是嵌套在某个子对象里(比如外层有个"response"或者"data"包装),你直接从根节点取自然会得到null,但打印整个JSON时因为包含所有层级,看起来数据是完整的。 - 数据类型不匹配的初始化问题:你的函数参数是
data: Any,如果传递过来的data是Data类型,直接用JSON(data)初始化可能会触发错误的解析逻辑(SwiftyJSON对不同类型的初始化逻辑不同),导致部分键解析异常。
快速调试方法
先通过以下步骤定位问题:
- 打印
data的实际类型和原始内容,确认输入是否符合预期:print("Data type: \(type(of: data))") print("Raw input data: \(data)") - 将整个JSON对象转成格式化的字符串打印,这样能看到最真实的键名和结构:
这一步能帮你快速发现键名拼写错误或者层级问题。if let rawJsonString = dict.rawString(.utf8, options: .prettyPrinted) { print("Full formatted JSON:\n\(rawJsonString)") }
修正后的代码示例
我调整了你的代码,增加了类型安全处理和更稳妥的取值方式,避免null问题:
func decodedNotificationTransactionData(data: Any, completionHandler: @escaping (_ dict: [String : Any]) -> ()){ let json: JSON // 先根据data的实际类型初始化SwiftyJSON if let dataDict = data as? [AnyHashable: Any] { json = JSON(dataDict) } else if let dataData = data as? Data { json = JSON(data: dataData) } else { print("Unsupported data type received") completionHandler([:]) return } // 打印格式化后的完整JSON,方便排查问题 if let rawString = json.rawString(.utf8, options: .prettyPrinted) { print("Full JSON content:\n\(rawString)") } // 使用SwiftyJSON的xxxValue方法安全取值,避免返回null let parsedData: [String: Any] = [ "id": json["id"].stringValue, "orderDate": json["orderDate"].stringValue, "patientName": json["patient"]["fullName"].stringValue, "patientAddress": json["patient"]["address"].stringValue, "caregiverName": json["care"]["fullName"].stringValue, "caregiverAddress": json["care"]["address"].stringValue, "serviceType": json["service"]["label"].stringValue, "status": json["status"].stringValue, "price": json["totalAmount"].stringValue, "otherNote": json["otherNote"].stringValue, "totalService": json["detailDatas"].count, "serviceLongType": json["detailDatas"][0]["type"].stringValue, "jsonContent": json.rawValue // 用rawValue获取原始的Any类型数据 ] completionHandler(parsedData) }
关键说明
- 使用
stringValue(对应类型用intValue/boolValue等)代替直接取JSON对象,这样即使键不存在或者类型不匹配,也会返回对应类型的默认值(比如空字符串),而不是打印null。 - 增加了
data类型的判断,确保SwiftyJSON用正确的方式初始化,避免解析异常。
内容的提问来源于stack exchange,提问作者Ega Setya Putra
相关产品推荐
相关产品推荐

