[英](De)serializing Json with System.Text.Json and Newtonsoft.Json
[英]Issues with System.Text.Json serializing Unicode characters (like emojis)
我正在将应用程序从.NET Core 2.2升级到.NET Core 3.0,新的System.Text.Json
序列化程序与Newtonsoft在2.2中的行为不同。 在诸如不间断空格(\\ u00A0)或表情符号字符之类的字符上,Newtonsoft(甚至Utf8Json)将它们序列化为它们的实际字符,而不是Unicode代码。
我创建了一个简单的.NET Fiddle来演示这一点。
var input = new Foo { Bar = "\u00A0 Test !@#$%^&*() 💯\uD83D\uDCAF 你好" };
var newtonsoft = Newtonsoft.Json.JsonConvert.SerializeObject(input);
var system = System.Text.Json.JsonSerializer.Serialize(input, new System.Text.Json.JsonSerializerOptions
{
Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
});
var utf8Json = Utf8Json.JsonSerializer.ToJsonString(input);
Console.WriteLine($"Original: {input.Bar} - {input.Bar.Contains('\u00A0')}"); // Original
Console.WriteLine($"Newtonsoft: {newtonsoft} - {newtonsoft.Contains('\u00A0')}"); // Works
Console.WriteLine($"System.Text.Json: {system} - {system.Contains('\u00A0')}"); // Does not work
Console.WriteLine($"Utf8Json: {utf8Json} - {utf8Json.Contains('\u00A0')}"); // Works
https://dotnetfiddle.net/erCaZl
是否有像Newtonsoft一样进行序列化的Encoder或JsonSerializerOptions
属性?
这是设计使然 。 我们的目标是提供安全的默认值,这就是为什么我们逃避任何事实(因为事实是安全的)而无法进行的。 出于实际原因,我们无法检测到所有安全字符,因为这将意味着我们需要运送大表并执行可能不平凡的查找。
如果您真的坚持,则可以扩展JavaScriptEncoder
类并自己选择编码的字符。 我建议不要这样做,因为如果您不小心,人们可能会潜入可能更改JSON语义的有效负载。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.