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

Swift使用Alamofire请求URL返回JSON解析提示格式错误如何解决

报错原因排查
  • 你获取到的JSON内容不符合标准JSON格式,当前返回的是多个JSON对象用逗号拼接的结构,没有外层包裹数组的方括号[],而你的代码里明确把解析结果强转为[[String:Any]](字典数组类型),结构不匹配自然解析失败。
  • 返回的JSON最后一个对象末尾多了一个多余的逗号,这也是标准JSON语法不允许的,会被解析器识别为语法错误。
解决方法

方案1:优先调整后端接口返回(推荐)

要求后端调整接口返回逻辑,输出标准JSON数组格式:

  1. 给所有对象外层加上[]包裹
  2. 删掉最后一个对象末尾的多余逗号

调整后正确的JSON格式如下:

[
  {"id" : "screens" ,"title" : "Skærmbilleder" ,"imagepath" : "https://www.spiritbooks.dk/service/menu/screens.png"},
  {"id" : "presale" ,"title" : "Presale" ,"imagepath" : "https://www.spiritbooks.dk/service/menu/presale.png"},
  {"id" : "discount" ,"title" : "Rabatkoder" ,"imagepath" : "https://www.spiritbooks.dk/service/menu/discount.png"},
  {"id" : "contact" ,"title" : "Kontakt" ,"imagepath" : "https://www.spiritbooks.dk/service/menu/contact.png"},
  {"id" : "about" ,"title" : "Om hjertechakra appen" ,"imagepath" : "https://www.spiritbooks.dk/service/menu/about.png"}
]

调整后端返回后,你现有的解析代码不需要做任何改动就可以正常运行。

方案2:前端临时兼容处理(仅适用于无法修改后端的场景)

如果暂时没有权限调整后端接口,可以在前端拿到返回数据后先做字符串预处理,补全结构再解析:

  1. 把返回的Data转成String
  2. 删掉末尾多余的逗号
  3. 首尾拼接[和],转成标准数组结构
  4. 再把处理后的String转回Data进行解析

对应的代码修改示例:

AF.request("myUrl").responseJSON { response in
    if let result = response.data, let rawJsonStr = String(data: result, encoding: .utf8) {
        do {
            // 预处理JSON字符串
            let processedStr = "[" + rawJsonStr.trimmingCharacters(in: .whitespacesAndNewlines).removeLastComma() + "]"
            guard let processedData = processedStr.data(using: .utf8) else { return }
            
            if let json = try JSONSerialization.jsonObject(with: processedData, options: []) as? [[String:Any]] {
                for categoryData in json{
                    var category = Category()
                    if let id = categoryData["id"] as? String{
                        category.id = id
                    }
                    if let title = categoryData["title"] as? String{
                        category.title = title
                    }
                    if let imagepath = categoryData["imagepath"] as? String{
                        category.imagepath = imagepath
                    }
                    self.categories.append(category)
                }
            }
        } catch let error as NSError {
            print("Failed to load: \(error.localizedDescription)")
        }
    }
}

// 扩展String实现删除末尾逗号的方法
extension String {
    func removeLastComma() -> String {
        if self.last == "," {
            return String(self.dropLast())
        }
        return self
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:24:03