dotnet core System.Text.Json 언 이스케이프 유니 코드 문자열

Sep 18 2019

을 사용 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 에서 코드 스 니펫을 만들었
습니다. 도와주세요.

답변

28 rcs Sep 19 2019 at 03:38

이러한 문자열을 인코딩하지 않도록 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);

결과:

콘솔에서 결과를 인쇄해야하는 경우 추가 언어를 설치해야 할 수 있습니다. 여기를 참조 하십시오 .

18 ahsonkhan Dec 10 2019 at 04:24

의 이스케이프 동작을 변경하려면 에 속성을 설정하여에 JsonSerializer사용자 지정 JavascriptEncoder을 전달할 수 있습니다 .JsonSerializerEncoderJsonSerializerOptions

https://docs.microsoft.com/en-us/dotnet/api/system.text.json.jsonserializeroptions.encoder?view=netcore-3.0#System_Text_Json_JsonSerializerOptions_Encoder

기본 동작은 보안을 염두에두고 JsonSerializer심층 방어를위한 과도한 탈출을 염두에두고 설계되었습니다 .

찾고있는 것이 라틴이 아닌 특정 언어의 특정 "영숫자"문자를 이스케이프하는 것이라면 인코더를 사용하는 대신 팩토리 방법을 JavascriptEncoder사용하여 생성하는 것이 좋습니다 .CreateUnsafeRelaxedJsonEscaping

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 인코딩 파일에 기록되거나 charset을 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을 참조하십시오 .

주의 사항 참조