Newtonsoft.Json反序列化后单引号显示为’的解决方法咨询
解决Newtonsoft.Json反序列化后单引号乱码为’的问题
这个乱码问题其实很常见——你看到的’是UTF-8编码的单引号’(右单引号,不是普通的')被错误地用Windows-1252(或类似单字节编码)解析后的结果。咱们从根源和解决方案两部分来处理:
问题根源
大概率是你获取sJsonCode的环节出了编码问题:
- 如果是从文件、网络请求或者流中读取JSON内容时,没有指定UTF-8编码,而是用了系统默认编码(比如Windows下的GBK或Windows-1252),导致UTF-8的字符被错误解码,后续反序列化自然会保留乱码。
- 少数情况是JSON本身的编码声明和实际编码不匹配,但Newtonsoft.Json默认会正确处理UTF-8的JSON。
解决方案
1. 从源头确保JSON字符串用UTF-8解码
这是最根本的解决方式,避免乱码产生:
- 如果从文件读取:
string sJsonCode = File.ReadAllText("yourJsonFile.json", Encoding.UTF8);
- 如果从网络请求获取(比如HttpClient):
var response = await httpClient.GetAsync("yourApiUrl"); string sJsonCode = await response.Content.ReadAsStringAsync(); // HttpClient默认用UTF-8,若接口有特殊声明可手动指定
- 如果从字节数组转字符串:
byte[] jsonBytes = ...; // 你的JSON字节数据 string sJsonCode = Encoding.UTF8.GetString(jsonBytes);
2. 修复已经乱码的字符串
如果sJsonCode已经是乱码状态,没法重新获取,也可以把乱码的字符串转回来:
foreach (var message in jsonData["messages"]) { string body = message.body.ToString(); // 将错误编码的字符串转回UTF-8 byte[] wrongBytes = Encoding.GetEncoding(1252).GetBytes(body); string correctedBody = Encoding.UTF8.GetString(wrongBytes); listBox1.Items.Add(correctedBody); }
3. 直接从字节流反序列化(更可靠)
跳过中间字符串转换环节,直接用UTF-8解码字节流后反序列化,避免编码丢失:
byte[] jsonBytes = ...; // 从文件/网络获取的原始字节 var jsonData = JsonConvert.DeserializeObject(Encoding.UTF8.GetString(jsonBytes));
验证步骤
你可以先在反序列化前输出sJsonCode的内容,看看里面的单引号是不是已经是’了:
Console.WriteLine(sJsonCode); // 检查原始JSON字符串是否已经乱码
如果原始字符串就乱码,那肯定是获取环节的问题,优先用方案1解决;如果原始字符串正常,反序列化后才乱码,那可以检查Newtonsoft.Json的配置(不过这种情况极少)。
内容的提问来源于stack exchange,提问作者Nick_F
相关产品推荐
相关产品推荐

