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

使用MicrosoftSpatialGeoJsonConverter调用reader.Skip()遇异常排查

解决Utf8JsonReader.Skip()抛出的"Cannot skip tokens on partial JSON"异常及定位无效字符

一、直接修复异常

异常提示明确说明,在处理**部分JSON(partial JSON)**时不能使用Skip(),需改用TrySkip()方法——它不会抛出异常,而是通过返回值告知是否成功跳过。

修改代码中else分支的逻辑:

else
{
    // 替换Skip()为TrySkip(),避免partial JSON下抛出异常
    reader.TrySkip(out _);
}

如果需要处理跳过失败的情况(比如确实到了JSON末尾),可以判断返回值:

else
{
    if (!reader.TrySkip(out _))
    {
        // 处理JSON不完整的情况,比如退出循环或返回null
        break;
    }
}

二、用bytesConsumed和TokenStartIndex定位无效字符

你可以通过这两个参数从原始JSON字节数组中提取出错位置的上下文,步骤如下:

  1. 获取原始的UTF-8 JSON字节数组(假设变量名为jsonBytes)
  2. 计算当前出错token的字节范围:
    • 起始位置:reader.TokenStartIndex
    • 结束位置:reader.BytesConsumed
  3. 提取该范围的字符串内容,查看具体token:
    string problematicToken = Encoding.UTF8.GetString(
        jsonBytes, 
        reader.TokenStartIndex, 
        (int)(reader.BytesConsumed - reader.TokenStartIndex)
    );
    
  4. 查看上下文:为了更清晰定位语法错误,可以提取出错位置前后的字节(比如各取20字节):
    int start = Math.Max(0, reader.TokenStartIndex - 20);
    int length = (int)(reader.BytesConsumed - start + 20);
    if (start + length > jsonBytes.Length)
    {
        length = jsonBytes.Length - start;
    }
    string context = Encoding.UTF8.GetString(jsonBytes, start, length);
    

通过上下文你可以检查是否存在引号未闭合、逗号缺失、语法格式错误等问题——比如你提到的触发错误的条目,很可能是crs部分的JSON结构不符合规范(比如缺少引号、键名未加双引号)。

三、额外优化:确保处理完整JSON(可选)

如果你的场景允许,也可以先把整个JSON响应读取到内存中,再创建Utf8JsonReader时设置isFinalBlock: true,这样Skip()方法就能正常使用:

// 先读取完整的JSON字节
byte[] fullJsonBytes = await response.Content.ReadAsByteArrayAsync();
using var reader = new Utf8JsonReader(fullJsonBytes, isFinalBlock: true);
// 后续读取逻辑不变

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 00:42:10