NSJSONserialisation因HTML错误返回nil,如何忽略错误解析有效JSON?
临时解决:从带PHP错误的响应中提取并解析有效JSON
当然可以在客户端做临时处理,把混在HTML错误信息里的有效JSON提取出来再解析。这里提供iOS平台的具体实现思路和代码示例:
核心思路
API响应里的有效JSON是从第一个{开始,到最后一个}结束的部分。我们可以先把响应转换成字符串,截取这一段内容,再转成Data进行JSON解析。
Swift 实现代码
func extractAndParseJSON(from responseData: Data) -> Any? { // 把响应数据转成字符串 guard let responseString = String(data: responseData, encoding: .utf8) else { print("无法将响应数据转换为字符串") return nil } // 定位JSON的起始位置(第一个{) guard let startMarkerIndex = responseString.firstIndex(of: "{") else { print("未找到JSON起始标记") return nil } // 定位JSON的结束位置(最后一个}) guard let endMarkerIndex = responseString.lastIndex(of: "}") else { print("未找到JSON结束标记") return nil } // 截取有效JSON字符串 let validJSONString = responseString[startMarkerIndex...endMarkerIndex] // 把截取后的字符串转回Data guard let validJSONData = validJSONString.data(using: .utf8) else { print("无法将有效JSON字符串转换为Data") return nil } // 解析JSON do { let parsedJSON = try JSONSerialization.jsonObject(with: validJSONData, options: []) return parsedJSON } catch { print("JSON解析失败: \(error.localizedDescription)") return nil } }
Objective-C 实现代码
id extractAndParseJSONFromResponseData(NSData *responseData) { // 转换响应数据为字符串 NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; if (!responseString) { NSLog(@"无法转换响应数据为字符串"); return nil; } // 查找JSON起始位置 NSRange startRange = [responseString rangeOfString:@"{"]; if (startRange.location == NSNotFound) { NSLog(@"未找到JSON起始符号"); return nil; } // 从后往前查找JSON结束位置 NSRange endRange = [responseString rangeOfString:@"}" options:NSBackwardsSearch]; if (endRange.location == NSNotFound) { NSLog(@"未找到JSON结束符号"); return nil; } // 截取有效JSON字符串 NSRange jsonRange = NSMakeRange(startRange.location, endRange.location - startRange.location + 1); NSString *validJSONString = [responseString substringWithRange:jsonRange]; // 转回Data并解析 NSData *validJSONData = [validJSONString dataUsingEncoding:NSUTF8StringEncoding]; NSError *parseError = nil; id parsedJSON = [NSJSONSerialization JSONObjectWithData:validJSONData options:0 error:&parseError]; if (parseError) { NSLog(@"JSON解析错误: %@", parseError.localizedDescription); return nil; } return parsedJSON; }
注意事项
- 这只是临时 workaround,最根本的解决办法还是修复API,让它不再输出PHP错误信息到响应体中(可以在PHP环境中关闭错误输出到浏览器,改用日志记录错误)。
- 这个方法对于嵌套JSON也能正常工作,因为我们找的是最后一个
},不会被内部的花括号干扰。 - 要确保API响应是UTF-8编码,否则字符串转换可能失败。
- 如果API后续响应格式变化(比如JSON不在最后),这个方法可能失效,所以还是优先推动API修复。
内容的提问来源于stack exchange,提问作者Ghazalah
相关产品推荐
相关产品推荐

