Excel中JSON反序列化遇\U转义错误:按需处理及UTF-8作用
解决JSON反序列化中\U转义序列的错误及UTF-8的作用
针对\U非法转义的精准处理
问题核心是JSON规范仅支持小写\u开头的Unicode转义序列,大写\U属于非法格式,直接全局替换\为\\会破坏合法转义(比如\"、\\、\uXXXX)。可以用正则表达式精准定位并修复非法的\U:
场景1:把\U当作普通字符保留
如果这些\U只是字符串中的普通字符组合,而非Unicode转义,用负向断言正则只替换未被转义的\U:
using System.Text.RegularExpressions; using Newtonsoft.Json; string rawJson = // 从Excel读取的单条JSON记录 // 仅替换前面无反斜杠的\U,避免破坏已转义的\\U string processedJson = Regex.Replace(rawJson, @"(?<!\\)\\U", @"\\U"); try { var result = JsonConvert.DeserializeObject(processedJson); // 后续业务处理 } catch (JsonException ex) { // 处理其他JSON格式错误 }
正则说明:(?<!\\)是负向回溯断言,确保匹配到的\前面没有另一个\(即不是已转义的\\U),只处理真正的非法转义序列。
场景2:\U是UTF-32字符转义
如果\U是UTF-32格式的字符转义(比如\U0001F600对应笑脸Emoji),需要将其转换为JSON支持的UTF-16代理对\u转义:
processedJson = Regex.Replace(rawJson, @"(?<!\\)\\U([0-9a-fA-F]{8})", match => { // 解析UTF-32代码点 uint codePoint = uint.Parse(match.Groups[1].Value, System.Globalization.NumberStyles.HexNumber); // 转换为UTF-16字符数组 char[] utf16Chars = char.ConvertFromUtf32((int)codePoint); // 生成JSON支持的\u转义序列 return $"\\u{((int)utf16Chars[0]).ToString("X4")}\\u{((int)utf16Chars[1]).ToString("X4")}"; });
这种处理既解决了报错,又能正确解析出原本的Unicode字符。
UTF-8在该场景的作用
- JSON默认编码规范:JSON官方规范要求默认使用UTF-8编码存储和传输,从Excel读取数据时确保用UTF-8编码读取,能避免因编码不匹配导致的字符乱码,减少非法转义序列的产生。
- Unicode转义的解析基础:JSON中的
\uXXXX转义对应UTF-16代码点,解析器最终会将其转换为UTF-8字节序列存储或显示。非法的\U转义无法被解析为有效的Unicode代码点,因此触发错误。 - 字符还原的关键:如果原始数据中的
\U是编码错误导致的,用UTF-8读取可以还原原始字符,避免错误的转义序列被引入。对于合法的Unicode字符,UTF-8能保证字符在存储和传输过程中无损失,确保解析后的结果符合预期。
内容的提问来源于stack exchange,提问作者Krishna
相关产品推荐
相关产品推荐

