C# dotnet core System.Text.Json unescape unicode字符串
使用C# dotnet core System.Text.Json unescape unicode字符串,c#,.net,json,.net-core,system.text.json,C#,.net,Json,.net Core,System.text.json,使用JsonSerializer.Serialize(obj)将生成一个转义字符串,但我需要未转义的版本。例如: 使用系统; 使用System.Text.Json; 公共课程 { 公共静态void Main() { var a=新的a{Name=”你好"}; var s=JsonSerializer.Serialize(a); 控制台。写入线(s); } } 甲级{ 公共字符串名称{get;set;} } 将生成一个字符串{“Name”:“\u4F60\u597D”},但我想要{“Name”:
JsonSerializer.Serialize(obj)
将生成一个转义字符串,但我需要未转义的版本。例如:
使用系统;
使用System.Text.Json;
公共课程
{
公共静态void Main()
{
var a=新的a{Name=”你好"};
var s=JsonSerializer.Serialize(a);
控制台。写入线(s);
}
}
甲级{
公共字符串名称{get;set;}
}
将生成一个字符串{“Name”:“\u4F60\u597D”}
,但我想要{“Name”:你好“}
我在创建了一个代码段
请帮助我。您需要设置JsonSerializer选项,使其不编码这些字符串
JsonSerializerOptions jso = new JsonSerializerOptions();
jso.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping;
然后在调用Serialize
方法时传递此选项
var s = JsonSerializer.Serialize(a, jso);
完整代码:
JsonSerializerOptions jso = new JsonSerializerOptions();
jso.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping;
var a = new A { Name = "你好" };
var s = JsonSerializer.Serialize(a, jso);
Console.WriteLine(s);
结果:
如果需要在控制台中打印结果,可能需要安装其他语言。请参阅。要更改
JsonSerializer
的转义行为,可以通过在JsonSerializerOp上设置Encoder
属性,将自定义JavascriptEncoder
传递到JsonSerializer
操作
默认行为的设计考虑到了安全性,而JsonSerializer
会越狱以进行纵深防御
如果您想要的只是转义特定非拉丁语言的某些“字母数字”字符,我建议您使用create
factory方法创建JavascriptEncoder
,而不是使用unasseredJSonescaping
编码器
JsonSerializerOptions选项=新的JsonSerializerOptions
{
编码器=JavaScriptEncoder.Create(UnicodeRanges.BasicLatin、UnicodeRanges.cjkunifiediodeographs)
};
var a=新的a{Name=”你好" };
var s=JsonSerializer.Serialize(a,选项);
控制台。写入线(s);
这样做可以保持某些安全防护,例如,HTML敏感字符将继续被转义
我要提醒大家不要轻率地使用System.Text.Encodings.Web.JavaScriptEncoder.unasseredJSonescaping
,因为它的转义最小(这就是为什么它的名称中有“不安全的”)。如果您正在创建的JSON被写入到磁盘上的UTF-8编码文件中,或者如果其web请求的一部分将字符集显式设置为UTF-8(并且不会像现在那样嵌入HTML组件),那么使用它可能是可以的
参见API文档中的备注部分:
您也可以考虑指定<代码> UnoDoRanges。如果您期望/需要所有语言保持未越狱,则所有的< /代码>。这仍然逃脱某些易受安全漏洞影响的ASCII字符。
JsonSerializerOptions选项=新的JsonSerializerOptions
{
编码器=JavaScriptEncoder.Create(unicorderanges.All)
};
有关更多信息和代码示例,请参阅:
您可以使用:
System.Text.RegularExpressions.Regex.Unescape(string)
取消unicode字符的显示。
从原始问题更新示例:
using System;
using System.Text.Json;
public class Program
{
public static void Main()
{
var a = new A{Name = "你好"};
var s = JsonSerializer.Serialize(a);
var unescaped = System.Text.RegularExpressions.Regex.Unescape(s);
Console.WriteLine(s);
Console.WriteLine(unescaped);
}
}
class A {
public string Name {get; set;}
}
输出:
{"Name":"\u4F60\u597D"}
{"Name":"你好"}
当我发现这一点时,我简直不敢相信自己的眼睛:默认编码器的这种行为非常令人惊讶。了解在您的场景中使用这种方法的潜在问题非常重要,如果可行的话,我会推荐更安全的替代方法。请看那些文档从未提及他们为什么避免序列化这些。为什么决定编码当像双引号
“
和控制字符这样的字符有特定的转义序列时,一切都会发生?!使用“不安全”编码不是答案,来自ahsonkhan的答案是correct@joey我知道这是迟来的,但它应该成为公认的答案