[ASP.NET Core] - JsonSerializer 이용 시 escape 하지 않는 방법

728x90
반응형

 

 

들어가며

ASP.NET CORE를 이용해서 프로젝트를 진행하던 도중, 타 사업부서와의 협업으로 인해 escape 처리가 되지 않은 문자열을 가공해줘야할 경우가 생겼습니다. 

이를 해결하기 위해서 사용했던 방법을 정리했습니다.

 

 


 

 

이스케이프 문자 (escape character) 란?

이스케이프 문자(Escape Character)는 특정 문자가 컴퓨터와 주변 기기의 상태를 바꾸는데 사용되어 출력에 사용되지 않는 제어 문자가 (줄바꿈일 때 \n 등) 예약되어 있을 때 제어문자를 나타내기 위한 문자를 의미한다. 
또는 특정 문자가 제어 문자로 활용되고 있을 때(명령 프롬프트에서 명령어 제어 문자인 &, | 등) 제어문자가 아닌 문자 그대로 입력한다는 것을 의미하기 위해 앞에 붙이는 문자를 의미하기도 한다.

 

출처 : https://librewiki.net/wiki/%EC%9D%B4%EC%8A%A4%EC%BC%80%EC%9D%B4%ED%94%84_%EB%AC%B8%EC%9E%90

 

이스케이프 문자에는 아래와 같은 종류가 존재합니다. 

 

위 Escape 문자를 사용하면 아래와 같이 프로그래밍으로 출력할 수 있습니다.

 

Console.WriteLine("문자열 입니다.");
출력 : 문자열 입니다.


Console.WriteLine("\'문자열 입니다.\'");

출력 : '문자열 입니다.'


Console.WriteLine("\"문자열 입니다.\"");

출력 : "문자열 입니다."

 

 


 

JsonSerializer 를 이용시 이스케이프 하지 않는 방법

System.Text.Json의 JsonSerializer를 이용해서 Serialize를 하게 될 경우 아래와 같이 escape 된 문자열이 생성이 되게 됩니다.

var name = new TeamName
{
	TeamName = "팀이름"
};

var str = JsonSerializer.Serialize(name);

// 결과
{"TeamName":"\uD5DB\uC2A4\uC719\uAE30\uB9B0A0"}

escape 가 되어도, Deserialize를 하게 되더라도 변환된 문자열을 사용하기 때문에 큰 이슈는 없지만, 

저와 같은 경우는, 프로그램내에서 사용하기 보다는 Log용으로 저장이 필요한 경우가 발생해서, 직관적으로 escape 가 적용되지 않은 문자열이 필요한 상황이였습니다.

 

 

이에 대한 해결책은 

JsonSerializerOptions 를 이용하면 간단하게 해결됩니다.

var name = new TeamName
{
	TeamName = "팀이름"
};

JsonSerializerOptions option = new JsonSerializerOptions();
option.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping;
var str = JsonSerializer.Serialize(name, option);

// 결과
{"TeamName":"팀이름"}

 

 

 

 

UnsafeRelaxedJsonEscaping 속성은?

기본 인코더와 달리 이 인코더 인스턴스는 <, >, &와 같은 HTML 구분 문자를 이스케이프하지 않습니다.

그러므로 주의해서 사용해야 합니다. 

예를 들어 출력 데이터가 UTF-8 로 설정된 Content-type의 응답 내에는 사용할 수 있습니다. 

기본 인코딩과 달리 따옴표는 \u0022가 아닌 \"로 인코딩됩니다.

 

 

 

 

 

 

 

 

728x90