Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# dotnet core System.Text.Json unescape unicode字符串_C#_.net_Json_.net Core_System.text.json - Fatal编程技术网

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我知道这是迟来的,但它应该成为公认的答案