C#中使用newtonsoft.json库解析JSON数据时,经常会遇到中文乱码问题,导致JSON无法正确解析,出现问号或其它乱码字符的情况。下面介绍一些解决方案:
方案一:设置JsonSerializerSettings
实例化JsonSerializer时,可以传递一个JsonSerializerSettings对象来设置序列化/反序列化时的行为,其中的一个属性是Encoding。如果不指定默认为UTF8。
string jsonString = "{\"name\":\"张三\"}";
JsonSerializer serializer = new JsonSerializer();
// 设置JsonSerializerSettings的 Encoding 为 Unicode
serializer.Settings.Encoding = Encoding.Unicode;
Person person = serializer.Deserialize<Person>(new StringReader(jsonString));
Console.WriteLine(person.Name); // 输出:张三
以上代码中,我们将JsonSerializerSettings对象的Encoding设置为Unicode,最终结果中的中文就能正常显示了。
方案二:使用JsonTextReader
另外一种解决方法是使用JsonTextReader来手动读取JSON数据,并设置其编码格式。
string jsonString = "{\"name\":\"张三\"}";
byte[] jsonBytes = Encoding.GetEncoding("gb2312").GetBytes(jsonString);
MemoryStream jsonStream = new MemoryStream(jsonBytes);
StreamReader jsonStreamReader = new StreamReader(jsonStream, Encoding.GetEncoding("gb2312"));
JsonTextReader reader = new JsonTextReader(jsonStreamReader) { SupportMultipleContent = true };
while (reader.Read())
{
if (reader.TokenType == JsonToken.PropertyName && (string)reader.Value == "name")
{
reader.Read();
Console.WriteLine(reader.Value); // 输出:张三
break;
}
}
以上代码中,首先将JSON字符串转换为指定编码的字节数组,并使用MemoryStream和StreamReader将其转换为一个可读取的流。然后创建一个JsonTextReader对象,并设置其支持多个JSON数据(例如数组)的解析,接着手动读取JSON数据,找到需要的信息后输出即可。
示例代码:
using Newtonsoft.Json;
using System;
using System.IO;
using System.Text;
namespace JsonDemo
{
class Program
{
static void Main(string[] args)
{
// 方案一示例代码
string jsonString = "{\"name\":\"张三\"}";
JsonSerializer serializer = new JsonSerializer();
serializer.Settings.Encoding = Encoding.Unicode;
Person person = serializer.Deserialize<Person>(new StringReader(jsonString));
Console.WriteLine(person.Name); // 输出:张三
// 方案二示例代码
jsonString = "{\"name\":\"张三\"}";
byte[] jsonBytes = Encoding.GetEncoding("gb2312").GetBytes(jsonString);
MemoryStream jsonStream = new MemoryStream(jsonBytes);
StreamReader jsonStreamReader = new StreamReader(jsonStream, Encoding.GetEncoding("gb2312"));
JsonTextReader reader = new JsonTextReader(jsonStreamReader) { SupportMultipleContent = true };
while (reader.Read())
{
if (reader.TokenType == JsonToken.PropertyName && (string)reader.Value == "name")
{
reader.Read();
Console.WriteLine(reader.Value); // 输出:张三
break;
}
}
}
}
public class Person
{
public string Name { get; set; }
}
}
以上就是C# newtonsoft.json中文乱码问号的解决方案。希望能对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# newtonsoft.json中文乱码问号的解决方案 - Python技术站