如何为JSON文件添加']'或移除末尾','并解决解析报错问题?
修复不规范JSON的解析问题
问题情况
手里的JSON文件有两种格式毛病:
- 末尾没加闭合方括号
] - 有些文件最后是逗号
,,不是]
用C#的JsonDocument.ParseAsync解析时直接触发异常,本来想在catch块里读文件改格式再重新解析,结果又报这个错:System.Text.Json.JsonReaderException: ']' is an invalid start of a value. LineNumber: 0 | BytePositionInLine: 0
为啥会报错?
核心问题是第一次用JsonDocument.ParseAsync读流的时候,已经把流读到末尾了,后面再用StreamReader读这个流,读出来的是空字符串。这时候给空字符串拼个],就变成只有]的文本,JSON解析器肯定认不出来,直接报错。
怎么解决?
换个思路,先把文件内容完整读到内存里,再处理格式问题,步骤如下:
- 先把整个文件内容读成字符串,避开流位置的坑
- 清理并修复JSON文本:
- 先把末尾的换行、空格这类空白字符去掉,避免干扰判断
- 如果最后一个字符是逗号,直接删掉
- 如果最后不是
],就补上这个闭合方括号
- 用修复后的文本重新解析
修正后的完整代码
// 先把文件内容完整读成字符串,避免流位置问题 string jsonText; using (var reader = new StreamReader(_loadedFile.OpenReadStream(maxAllowedSize: 1024 * 1024 * 10))) { jsonText = await reader.ReadToEndAsync(); } JsonDocument json = null; try { // 先尝试正常解析 using var doc = JsonDocument.Parse(jsonText); json = doc.Clone(); // 按需处理文档内容,这里用Clone保留实例 } catch (JsonException ex) { Console.WriteLine(ex.Message); // 开始修复JSON格式 jsonText = jsonText.TrimEnd(); // 先清掉末尾的空白字符 if (!string.IsNullOrEmpty(jsonText)) { // 处理末尾是逗号的情况 if (jsonText[^1] == ',') { jsonText = jsonText.Substring(0, jsonText.Length - 1); } // 检查是否缺闭合方括号 if (jsonText[^1] != ']') { jsonText += ']'; } } // 重新解析修复后的JSON,再加一层try-catch防还有错 try { using var fixedDoc = JsonDocument.Parse(jsonText); json = fixedDoc.Clone(); } catch (JsonException fixEx) { Console.WriteLine($"修复后还是解析失败:{fixEx.Message}"); // 这里可以加自己的错误处理逻辑,比如记录日志啥的 } }
关键点说明
- 先读完整文本到内存,彻底避开流多次读取的位置问题
- 修复前先清末尾空白,不然换行、空格会影响你判断最后一个字符
- 代码里用的
jsonText[^1]是C# 8.0+的语法,直接取最后一个字符,旧版本可以换成jsonText[jsonText.Length - 1] - 二次解析也要套try-catch,万一JSON还有其他格式问题,比如中间缺引号之类的,不至于直接崩
内容的提问来源于stack exchange,提问作者Sarahrb
相关产品推荐
相关产品推荐

