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

SwiftyJSON解析通知数据时的字段取值异常问题咨询

解决SwiftyJSON解析时单独取键返回null的问题

我之前确实碰到过一模一样的SwiftyJSON解析问题!明明打印整个JSON对象时数据都正常,但单独取某个键却返回null,大概率是这几个原因导致的:

可能的原因

  • 键名拼写/大小写错误:JSON的键名是区分大小写的,比如实际后端返回的是"Status"而不是你写的"status",或者键名里有隐藏的空格、特殊字符,打印整个JSON时可能因为格式问题看不出来,导致单独取值失败。
  • JSON结构层级错误:有时候status并不是直接在根节点,而是嵌套在某个子对象里(比如外层有个"response"或者"data"包装),你直接从根节点取自然会得到null,但打印整个JSON时因为包含所有层级,看起来数据是完整的。
  • 数据类型不匹配的初始化问题:你的函数参数是data: Any,如果传递过来的data是Data类型,直接用JSON(data)初始化可能会触发错误的解析逻辑(SwiftyJSON对不同类型的初始化逻辑不同),导致部分键解析异常。

快速调试方法

先通过以下步骤定位问题:

  1. 打印data的实际类型和原始内容,确认输入是否符合预期:
    print("Data type: \(type(of: data))")
    print("Raw input data: \(data)")
    
  2. 将整个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:54:08