Swift中URL传递JSON及反序列化格式化问题求助
问题根源与解决方案
核心问题:URL参数未编码导致data字段截断
你遇到的data字段被截断、反序列化失败,本质是未对JSON字符串做URL编码就直接放入URL参数。URL里的特殊字符(比如{、}、"、换行符\n)会被系统解析为URL结构的一部分,导致参数被提前截断,最终拿到的是不完整的无效JSON数据,自然无法反序列化。
解决步骤
1. 修正网站中的回调URL格式
在webcode.tools网站输入回调URL时,必须先将data对应的JSON字符串做URL编码,再填入参数:
- 原始JSON(建议去掉换行,避免额外编码):
{"name": "ios", "age": 10} - 对该JSON字符串做URL编码后得到:
%7B%22name%22%3A%22ios%22%2C%22age%22%3A10%7D - 最终完整的回调URL应为:
myApp://home/redirect?status=Wow-2023&code=200&data=%7B%22name%22%3A%22ios%22%2C%22age%22%3A10%7D
2. 修正Swift中的反序列化逻辑
拿到回调URL中的data字段值后,先做URL解码,再进行反序列化:
步骤1:定义符合Codable的Person模型
struct Person: Codable { let name: String let age: Int }
步骤2:完整的解码流程
// 假设你已经从回调URL中提取出dataString(比如通过URLComponents解析) guard let dataString = urlComponents.queryItems?.first(where: { $0.name == "data" })?.value else { print("未获取到data参数") return } // 第一步:URL解码 guard let decodedDataString = dataString.removingPercentEncoding else { print("URL解码失败") return } // 第二步:转成Data并解码 guard let data = decodedDataString.data(using: .utf8) else { print("字符串转Data失败") return } do { let person = try JSONDecoder().decode(Person.self, from: data) print("解码成功:name=\(person.name), age=\(person.age)") } catch { print("解码失败:\(error.localizedDescription)") }
3. 原方法失败的原因
- 自定义
nsdataToJSON返回nil:因为拿到的data是截断后的无效JSON,JSONSerialization无法解析非法格式的JSON数据。 JSONDecoder无返回值:同样是因为dataString不完整,转成的Data是无效JSON,解码抛出异常被try?吞掉,进入else分支。
内容的提问来源于stack exchange,提问作者AadityaS
相关产品推荐
相关产品推荐

