Swift使用Alamofire请求URL返回JSON解析提示格式错误如何解决
报错原因排查
- 你获取到的JSON内容不符合标准JSON格式,当前返回的是多个JSON对象用逗号拼接的结构,没有外层包裹数组的方括号
[],而你的代码里明确把解析结果强转为[[String:Any]](字典数组类型),结构不匹配自然解析失败。 - 返回的JSON最后一个对象末尾多了一个多余的逗号,这也是标准JSON语法不允许的,会被解析器识别为语法错误。
解决方法
方案1:优先调整后端接口返回(推荐)
要求后端调整接口返回逻辑,输出标准JSON数组格式:
- 给所有对象外层加上
[]包裹 - 删掉最后一个对象末尾的多余逗号
调整后正确的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:前端临时兼容处理(仅适用于无法修改后端的场景)
如果暂时没有权限调整后端接口,可以在前端拿到返回数据后先做字符串预处理,补全结构再解析:
- 把返回的Data转成String
- 删掉末尾多余的逗号
- 首尾拼接
[和],转成标准数组结构 - 再把处理后的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
相关产品推荐
相关产品推荐

