使用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字节数组中提取出错位置的上下文,步骤如下:
- 获取原始的UTF-8 JSON字节数组(假设变量名为
jsonBytes) - 计算当前出错token的字节范围:
- 起始位置:
reader.TokenStartIndex - 结束位置:
reader.BytesConsumed
- 起始位置:
- 提取该范围的字符串内容,查看具体token:
string problematicToken = Encoding.UTF8.GetString( jsonBytes, reader.TokenStartIndex, (int)(reader.BytesConsumed - reader.TokenStartIndex) ); - 查看上下文:为了更清晰定位语法错误,可以提取出错位置前后的字节(比如各取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
相关产品推荐
相关产品推荐

