source

닷넷 코어 시스템.Text.Json 이스케이프 해제 유니코드 문자열

itover 2023. 3. 18. 08:32
반응형

닷넷 코어 시스템.Text.Json 이스케이프 해제 유니코드 문자열

사용.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);

결과:

여기에 이미지 설명 입력

콘솔에서 결과를 인쇄해야 할 경우 추가 언어를 설치해야 할 수 있습니다.여기를 참조해 주세요.

의 이스케이프 동작을 변경하려면JsonSerializer당신은 커스텀을 통과시킬 수 있다JavascriptEncoder에게JsonSerializer을 설정함으로써Encoder의 부동산JsonSerializerOptions.

https://learn.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://learn.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://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-how-to?view=netcore-3.0#customize-character-encoding참조해 주세요.

주의사항 참조

용도:

JsonSerializerOptions options = new JsonSerializerOptions
{
    Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
};

다음과 같습니다.System.Text.RegularExpressions.Regex.Unescape(string)Unicode 문자를 이스케이프 해제합니다.https://learn.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":"你好"}

언급URL : https://stackoverflow.com/questions/58003293/dotnet-core-system-text-json-unescape-unicode-string

반응형