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

使用Moya发送SwiftyJSON数组崩溃,报Invalid type in JSON write错误

解决Moya+SwiftyJSON数组序列化崩溃问题

你遇到的这个崩溃核心原因是:SwiftyJSON的JSON是自定义类型,JSONEncoding无法直接识别并序列化它,系统不知道怎么把SwiftyJSON对象转成标准JSON数据,所以才抛出Invalid type in JSON write (_SwiftValue)的错误。

下面给你几个具体的解决思路:

  • 将SwiftyJSON数组转换为原生Swift数组
    你需要把json.array里的每个JSON实例转成对应的原生Swift类型(比如[String:Any]、String、Int等),SwiftyJSON提供了object属性可以直接完成这个转换:

    case let .example(token, json):
        // 安全转换SwiftyJSON数组为原生Swift数组,空值时返回空数组兜底
        let nativeChoices = json?.array?.map { $0.object } ?? []
        return .requestParameters(
            parameters: ["token": token, "choices": nativeChoices],
            encoding: JSONEncoding.default
        )
    

    $0.object会自动把SwiftyJSON对象映射成它对应的原生类型,这样JSONEncoding就能正常处理序列化了。

  • 修复强制解包的风险
    你代码里用了json!强制解包,这是非常危险的操作——如果json为nil,程序会直接崩溃。上面的代码用json?.array和空合并运算符?? []做了安全处理,即使json或者json.array是nil,也能传递一个空数组,避免不必要的崩溃。

  • 验证转换后的类型(排查用)
    如果还是有问题,可以打印转换后的数组来验证:

    print("原生数组内容:\(nativeChoices)")
    print("原生数组类型:\(type(of: nativeChoices))")
    

    确保输出的是Array<Any>类型,且数组里的元素都是系统支持的JSON可序列化类型(比如字典、字符串、数字等),没有残留的SwiftyJSON对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:23:31