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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:06:48