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

如何将Swift结构体转为URL合法字符串并实现反向解析?

Swift自定义结构体转URL兼容字符串及解析修复

需求:将自定义Swift结构体转换为可附加到URL的字符串,后续能从URL解析回原结构体,但现有代码运行后无法正常解析。

原尝试代码

struct MyObject: Codable {
    var number: Int
    var title: String
    var arrayString: [String]
}
let myObject = MyObject(number: 2, title: "hello", arrayString: ["item 1", "item 2"])
let data = try JSONEncoder().encode(myObject)
let stringData = data.base64EncodedString()
print("stringData:", stringData)
let validURL = URL(string: "https:google.com/" + stringData)
print("validURL:", validURL?.absoluteString ?? "")

if let newStringData = validURL?.absoluteString.replacingOccurrences(of: "https:google.com/", with: "").data(using: .utf8) {
    let newData = Data(base64Encoded: newStringData)
    if let newObject = try? JSONDecoder().decode(MyObject.self, from: newStringData) {
        print("new parsed object:", newObject)
    } else {
        print("shit!")
    }
} else {
    print("Oops")
}

原运行输出

stringData: https:google.com/eyJumluZyI6WyJpdGVtIDEiLCJpdGVtIDIiXX0=
validURL: https:google.com/https:google.com/eyJumluZyI6WyJpdGVtIDEiLCJpdGVtIDIiXX0=
shit!

问题分析

  1. URL构造错误:原代码中URL前缀写成"https:google.com/",缺少双斜杠//,导致URL拼接逻辑混乱,出现重复前缀的情况。
  2. 解析时数据源错误:解码结构体时误用了newStringData(原始字符串转的Data),而正确的数据源应该是base64解码后的newData。
  3. Base64字符串未做URL安全处理:标准Base64中的+、/、=字符属于URL保留字符,直接拼接会导致URL失效或解析错误,需要使用URL安全的Base64编码。

修正后的代码

struct MyObject: Codable {
    var number: Int
    var title: String
    var arrayString: [String]
}

do {
    let myObject = MyObject(number: 2, title: "hello", arrayString: ["item 1", "item 2"])
    
    // 1. 结构体转JSON Data
    let jsonData = try JSONEncoder().encode(myObject)
    
    // 2. 使用URL安全的Base64编码(替换+为-,/为_,去掉末尾的=)
    let base64String = jsonData.base64EncodedString()
        .replacingOccurrences(of: "+", with: "-")
        .replacingOccurrences(of: "/", with: "_")
        .replacingOccurrences(of: "=", with: "")
    
    print("URL安全的Base64字符串:", base64String)
    
    // 3. 构造正确的URL(补全//)
    guard let validURL = URL(string: "https://google.com/\(base64String)") else {
        print("URL构造失败")
        return
    }
    print("完整URL:", validURL.absoluteString)
    
    // 4. 从URL解析回结构体
    // 提取Base64部分并还原为标准Base64格式
    let extractedString = validURL.absoluteString.replacingOccurrences(of: "https://google.com/", with: "")
        .replacingOccurrences(of: "-", with: "+")
        .replacingOccurrences(of: "_", with: "/")
    // 补全缺失的=字符,保证Base64长度是4的倍数
    let paddingCount = 4 - (extractedString.count % 4)
    let standardBase64String = extractedString + String(repeating: "=", count: paddingCount % 4)
    
    guard let decodedData = Data(base64Encoded: standardBase64String),
          let newObject = try? JSONDecoder().decode(MyObject.self, from: decodedData) else {
        print("解析失败")
        return
    }
    
    print("解析后的结构体:", newObject)
} catch {
    print("编码错误:", error)
}

关键修复点说明

  • URL格式修正:将URL前缀改为"https://google.com/",符合标准URL格式。
  • URL安全Base64:替换标准Base64中的特殊字符,避免URL解析异常;解析时再还原回标准Base64格式,并补全必要的填充字符。
  • 解析数据源修正:使用Base64解码后的decodedData进行结构体解码,而不是原始字符串Data。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 00:13:16