使用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
相关产品推荐
相关产品推荐

