dotnet 核心 System.Text.Json 转义 unicode 字符串
dotnet core System.Text.Json unescape unicode string
使用JsonSerializer.Serialize(obj)
将产生转义字符串,但我想要未转义的版本。例如:
using System;
using System.Text.Json;
public class Program
{
public static void Main()
{
var a = new A{Name = "你好"};
var s = JsonSerializer.Serialize(a);
Console.WriteLine(s);
}
}
class A {
public string Name {get; set;}
}
会产生一个字符串 {"Name":"\u4F60\u597D"}
但我想要 {"Name":"你好"}
我在 https://dotnetfiddle.net/w73vnO
创建了一个代码片段
请帮助我。
您需要设置 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);
结果:
如果您需要在控制台打印结果,您可能需要安装额外的语言。请参考here.
要更改 JsonSerializer
的转义行为,您可以通过在JsonSerializerOptions
.
默认行为的设计考虑到了安全性,JsonSerializer
过度逃逸是为了纵深防御。
如果您要查找的只是转义特定非拉丁语言的某些 "alphanumeric" 字符,我建议您改为使用 Create
工厂方法创建 JavascriptEncoder
而不是使用 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
,因为它会进行最少的转义(这就是名称中有 "unsafe" 的原因)。如果您正在创建的 JSON 被写入磁盘上的 UTF-8 编码文件,或者如果其网络请求的一部分明确将字符集设置为 utf-8(并且不会潜在地嵌入到 HTML组件原样),那么使用它可能就可以了。
请参阅 API 文档中的备注部分:
https://docs.microsoft.com/en-us/dotnet/api/system.text.encodings.web.javascriptencoder.unsaferelaxedjsonescaping?view=netcore-3.0#remarks
如果您 expect/need 所有语言都保持未转义,您也可以考虑指定 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
See the Caution Note
您可以使用:System.Text.RegularExpressions.Regex.Unescape(string)
对 unicode 字符进行转义。
https://docs.microsoft.com/en-us/dotnet/api/system.text.regularexpressions.regex.unescape
更新原始问题的示例:
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":"你好"}
使用:
JsonSerializerOptions options = new JsonSerializerOptions
{
Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
};
使用JsonSerializer.Serialize(obj)
将产生转义字符串,但我想要未转义的版本。例如:
using System;
using System.Text.Json;
public class Program
{
public static void Main()
{
var a = new A{Name = "你好"};
var s = JsonSerializer.Serialize(a);
Console.WriteLine(s);
}
}
class A {
public string Name {get; set;}
}
会产生一个字符串 {"Name":"\u4F60\u597D"}
但我想要 {"Name":"你好"}
我在 https://dotnetfiddle.net/w73vnO
创建了一个代码片段
请帮助我。
您需要设置 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);
结果:
如果您需要在控制台打印结果,您可能需要安装额外的语言。请参考here.
要更改 JsonSerializer
的转义行为,您可以通过在JsonSerializerOptions
.
默认行为的设计考虑到了安全性,JsonSerializer
过度逃逸是为了纵深防御。
如果您要查找的只是转义特定非拉丁语言的某些 "alphanumeric" 字符,我建议您改为使用 Create
工厂方法创建 JavascriptEncoder
而不是使用 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
,因为它会进行最少的转义(这就是名称中有 "unsafe" 的原因)。如果您正在创建的 JSON 被写入磁盘上的 UTF-8 编码文件,或者如果其网络请求的一部分明确将字符集设置为 utf-8(并且不会潜在地嵌入到 HTML组件原样),那么使用它可能就可以了。
请参阅 API 文档中的备注部分: https://docs.microsoft.com/en-us/dotnet/api/system.text.encodings.web.javascriptencoder.unsaferelaxedjsonescaping?view=netcore-3.0#remarks
如果您 expect/need 所有语言都保持未转义,您也可以考虑指定 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
See the Caution Note
您可以使用:System.Text.RegularExpressions.Regex.Unescape(string)
对 unicode 字符进行转义。
https://docs.microsoft.com/en-us/dotnet/api/system.text.regularexpressions.regex.unescape
更新原始问题的示例:
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":"你好"}
使用:
JsonSerializerOptions options = new JsonSerializerOptions
{
Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
};