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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:08:26