无需临时文件,从文件字节提取文本并反序列化为C#对象
解决JSON反序列化时的「Unexpected character encountered」错误
你的测试字节数组开头的255,254是**UTF-16 LE(小端)**的字节序标记(BOM),后续每个JSON字符都以双字节形式存储,说明原文件采用UTF-16编码,而非UTF-8或系统默认编码。
之前使用Encoding.Default或Encoding.UTF8转换字节数组时,会破坏双字节字符结构,生成包含无法识别乱码的字符串,导致JSON解析器抛出「Unexpected character encountered」错误。
修正方案
使用Encoding.Unicode.GetString()(.NET中Encoding.Unicode对应UTF-16 LE编码)转换字节数组,即可得到正确的JSON字符串:
var p = new byte[] { 255, 254, 123, 0, 34, 0, 114, 0, 101, 0, 99, 0, 116, 0, 115, 0, 34, 0, 58, 0, 91, 0, 93, 0, 44, 0, 34, 0, 116, 0, 101, 0, 120, 0, 116, 0, 34, 0, 58, 0, 34, 0, 34, 0, 125, 0 }; // 用UTF-16 LE编码转换字节数组 var p2 = System.Text.Encoding.Unicode.GetString(p); // 正常执行反序列化 dynamic p3 = JsonConvert.DeserializeObject<dynamic>(p2); Console.WriteLine(p3.text); Console.WriteLine(p3.rects);
你也可以使用Encoding.GetEncoding(1200)替代Encoding.Unicode,二者效果完全一致(1200是UTF-16 LE的官方代码页编号)。
内容的提问来源于stack exchange,提问作者Caleb Keller
相关产品推荐
相关产品推荐

