要更改 的转义行为,JsonSerializer
您可以通过在上设置属性将自定义传递JavascriptEncoder
给。JsonSerializer
Encoder
JsonSerializerOptions
https://docs.microsoft.com/en-us/dotnet/api/system.text.json.jsonserializeroptions.encoder?view=netcore-3.0#System_Text_Json_JsonSerializerOptions_Encoder
默认行为的设计考虑了安全性和JsonSerializer
深度防御的过度逃逸。
如果您正在寻找的只是转义特定非拉丁语言的某些“字母数字”字符,我建议您改为JavascriptEncoder
使用Create
工厂方法而不是使用UnsafeRelaxedJsonEscaping
编码器来创建。
JsonSerializerOptions options = new JsonSerializerOptions
{
Encoder = JavaScriptEncoder.Create(UnicodeRanges.BasicLatin, UnicodeRanges.CjkUnifiedIdeographs)
};
var a = new A { Name = "你好" };
var s = JsonSerializer.Serialize(a, options);
Console.WriteLine(s);
这样做可以保护某些安全措施,例如,HTML 敏感字符将继续被转义。
我会告诫不要 System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping
轻率地使用它,因为它会进行最少的转义(这就是名称中包含“不安全”的原因)。如果您正在创建的 JSON 被写入磁盘上的 UTF-8 编码文件,或者如果它的 Web 请求部分明确将字符集设置为 utf-8(并且不会按原样嵌入到 HTML 组件中),那么使用它可能是可以的。
请参阅 API 文档中的备注部分:
https ://docs.microsoft.com/en-us/dotnet/api/system.text.encodings.web.javascriptencoder.unsaferelaxedjsonescaping?view=netcore-3.0#remarks
您还可以考虑指定UnicodeRanges.All
是否希望/需要所有语言保持未转义。这仍然会转义某些容易出现安全漏洞的 ASCII 字符。
JsonSerializerOptions options = new JsonSerializerOptions
{
Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
};
有关更多信息和代码示例,请参阅:https ://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-how-to?view=netcore-3.0#customize-character-encoding
请参阅注意事项