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

Swift中JSON解析为模型对象的实现及相关咨询

在Swift中解析JSON为GradingData模型对象

嘿,看起来你已经搞定了测试数据的模型实例,现在要实现JSON到模型的解析对吧?在Swift里最省心高效的方式就是用Codable协议,我给你一步步讲清楚怎么弄:

第一步:让你的GradingData模型遵循Codable协议

首先要确保你的GradingData结构体(或者类)实现Codable协议——Swift会自动为所有属性都是Codable类型的结构体合成协议方法,不用你手动写编码解码逻辑。比如:

struct GradingData: Codable {
    let lot: String
    let andColumns: String
    let SLAIssuedFinalGrading: Bool
    let SLAIssuedFinalGradingDate: String
    let CityApprovalIssued: Bool
    let CityCommentReceived: Bool
    let GradingRepair: String
    let CurbStopRepair: String
    let SplashPadDownSpout: String
    let RYCBOtherRepairs: String
    let Comments: String
    let columnCamera: String
    // 记得把你原来方法里的DepositRecei...这类未补全的属性也加进来哦
}

如果JSON里的键名和你模型的属性名不一致(比如JSON里是小驼峰slaIssuedFinalGrading,而你模型是大驼峰开头),那你需要手动定义CodingKeys枚举来做映射:

extension GradingData {
    enum CodingKeys: String, CodingKey {
        case lot
        case andColumns
        case SLAIssuedFinalGrading = "slaIssuedFinalGrading"
        // 其他属性如果需要映射也在这里添加
    }
}

第二步:编写JSON解析函数

接下来写一个通用的解析函数,把JSON的Data类型转换成你的模型对象(或者模型数组):

解析单个模型对象

func parseSingleGradingData(from jsonData: Data) -> GradingData? {
    let decoder = JSONDecoder()
    
    // 如果你模型里的日期是Date类型,而JSON里是字符串格式,需要设置日期解码策略
    // 比如自定义日期格式:
    // let dateFormatter = DateFormatter()
    // dateFormatter.dateFormat = "yyyy-MM-dd"
    // decoder.dateDecodingStrategy = .formatted(dateFormatter)
    
    do {
        let gradingData = try decoder.decode(GradingData.self, from: jsonData)
        return gradingData
    } catch {
        print("解析出错啦:\(error.localizedDescription)")
        // 也可以打印详细错误信息排查问题:print(error)
        return nil
    }
}

解析模型数组(对应你测试方法返回的数组类型)

如果你的JSON是数组格式,就用这个版本:

func parseGradingDataArray(from jsonData: Data) -> [GradingData]? {
    let decoder = JSONDecoder()
    
    do {
        let gradingDataArray = try decoder.decode([GradingData].self, from: jsonData)
        return gradingDataArray
    } catch {
        print("数组解析出错:\(error.localizedDescription)")
        return nil
    }
}

第三步:实际使用示例

比如你有一个JSON字符串,先转成Data再传入解析函数:

// 示例JSON字符串(和你的模型属性对应)
let sampleJsonString = """
[
    {
        "lot": "lot123",
        "andColumns": "col456",
        "SLAIssuedFinalGrading": true,
        "SLAIssuedFinalGradingDate": "2024-05-20",
        "CityApprovalIssued": true,
        "CityCommentReceived": false,
        "GradingRepair": "completed",
        "CurbStopRepair": "pending",
        "SplashPadDownSpout": "none",
        "RYCBOtherRepairs": "none",
        "Comments": "all checks passed",
        "columnCamera": ""
    }
]
"""

// 把字符串转成Data
if let jsonData = sampleJsonString.data(using: .utf8) {
    // 解析数组
    if let gradingDataArray = parseGradingDataArray(from: jsonData) {
        print("解析成功!第一个数据的lot是:\(gradingDataArray[0].lot)")
    }
}

一些额外注意点

  • 如果JSON里的某些字段是可选的(可能不存在),记得把模型里对应的属性设为可选类型,比如let lot: String?
  • 如果模型里有嵌套的自定义对象,那嵌套的对象也需要遵循Codable协议
  • 从网络请求获取JSON时,直接把请求返回的Data传入解析函数即可,不用额外转换

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:14:34