its_jh_stroy

[C#] System.Text.Json과 Newtonsoft.Json 본문

C#

[C#] System.Text.Json과 Newtonsoft.Json

_J_H_ 2024. 1. 30. 22:03

.NET에서 JSON과 관련된 라이브러리는 System.Text.Json과 Newtonsoft.Json가 많이 사용된다.
두 라이브러리는 모두 JSON 문자열과 .NET 객체 간 직렬화와 역직렬화를 수행하지만 몇 가지 차이점이 있다.
 

1. 대소문자 구분

대소문자를 구분하는 System.Text.Json과 달리 Newtonsoft.Json은 대소문자를 구분하지 않는다.
MVC 패턴에서 컨트롤러가 뷰에 전달하는 JSON 데이터는 CamelCase 형식으로 전달되는 경우가 많은데, .NET 객체의 속성은 PascalCase로 작성되어 있다.
따라서 System.Text.Json를 사용하는 경우 속성명이 맞지 않다고 판단되어 값이 제대로 전달되지 않게 된다.
이것을 해결하기 위해 대소문자를 구분하지 않는 별도의 처리가 필요하다.
대소문자를 구분하지 않는 Newtonsoft.Json를 사용하는 경우 별도의 처리 없이 전달받을 수 있다.

HttpClient client = new HttpClient();
var response = await client.GetAsync("요청 URI");

// [{"name":"A Coffee","price":3500},{"name":"B Coffee","price":2000}]
// 컨트롤러에서 Name과 Price 속성이 name과 price로 변환되어 전달되었다.
var content = await response.Content.ReadAsStringAsync();

// 성공한 경우
// coffee1과 coffee2는 같은 값을 가지는 객체이다.
if (response.IsSuccessStatusCode)
{
    // 대소문자 구분 안 함 옵션
    var options = new System.Text.Json.JsonSerializerOptions
    {
        PropertyNameCaseInsensitive = true,
    };

// System.Text.Json
    var coffee1 = JsonSerializer.Deserialize<IEnumerable<Coffee>>(content, options);

// Newtonsoft.Json
    var coffee2 = JsonConvert.DeserializeObject<IEnumerable<Coffee>>(content);
}



2. Non-ASCII 문자와 특수문자 처리
직렬화 과정에서 System.Text.Json은 non-ASCII 문자는 유니코드로 변환하고, 특수문자는 escape 처리한다.
반면에 Newtonsoft.Json은 모든 문자를 그대로 직렬화한다.
따라서 System.Text.Json은 웹 페이지에 스크립트를 삽입하는 XSS(Cross-Site Scripting) 공격의 대응책 중 하나가 될 수 있다.

Board board = new Board()
{
    Title = "ррр",            
    Description = "<script>alert('Hello World');</script>"
};


string jsonString1 = JsonSerializer.Serialize(board); // System.Text.Json
string jsonString2 = JsonConvert.SerializeObject(board); // Newtonsoft.Json


// 특수문자(escape 처리) : <, >
// Non-ASCII 문자(유니코드로 변환 처리) :р
Console.WriteLine(jsonString1);       
// {
//      "Title":"\u0440\u0440\u0440"
//      ,"Description":"\u003Cscript\u003Ealert(\u0027Hello World\u0027);\u003C/script\u003E"
// }


Console.WriteLine(jsonString2);
// {
//      "Title":"ррр"
//      ,"Description":"<script>alert('Hello World');</script>"
// }

 


3. 트레일링 콤마(trailing commas)

System.Text.Json은 트레일링 콤마를 허용하지 않는다.
따라서 JSON 데이터 끝에 콤마가 있다면 역직렬화 과정 중 오류가 발생한다.

string jsongString = "{\"Title\":\"kim\",\"Description\":\"This is ...\",}";

// System.Text.Json  -> 오류 발생        
Board board1 = JsonSerializer.Deserialize<Board>(jsongString); 

// Newtonsoft.Json
Board board2 = JsonConvert.DeserializeObject<Board>(jsongString);