dev/asp.net, c#

[c#] System.Text.Json 네임스페이스 - JSON Object, Serialize, Deserialize

코딩for 2022. 11. 29. 13:05
반응형

System.Text.Json 

 

.Net 에서 JSON Object 를 다루기 위해서 

대부분  Newtonsoft.Json 패키지를 이용하여 JSON 작업을 하였다. 하지만 .net core 3.0 버전부터 추가가 되면서 점차 그 영역을 확장하고 있다.

 

NewtonSoft.Json 에 관한 간단한 내용은 아래를 참고

[dev/asp.net, c#] - [c#] JSON 형변환(Json Convert) with JSON.NET

[dev/asp.net, c#] - [c#] JSON.NET 을 이용한 Json 데이터 파싱 - Json Key Name 가져오기 (JObject, JToken)

 

 

2022-11-29일 현재 최신버전 및 사용가능한 프레임워크

 

 

.NET 개체와  JSON 데이터의  양방향 변환 방법(직렬화, 역직렬화)

Serialize & Deserialize

 

테스트 데이터 

// Person.cs  데이터 모델

public class Person
{
    public string Name { get; set; } = "";
    public string Address { get; set; } = "";
    public List<string> Phone { get; set; } = new List<string> { };

    public static List<Person> GetList()
    {
        return new List<Person>
        {
            new Person { Name = "홍길동" },
            new Person { Name = "고길동", Address = "seoul" },
            new Person { Name = "남길동", Address = "seoul" },
            new Person { Name = "박길동", Address = "busan", Phone= new List<string>{ "1234-5678", "5678-4457" } },
            new Person { Name = "유길동", Address = "suwon", Phone= new List<string>{ "1124-1457"} },
        };
    }

    public static Person Get()
    {
        return new Person
        {
            Name = "박길동",
            Address = "busan",
            Phone = new List<string> { "1234-5678", "5678-4457" }
        };
    }
}

 

테스트 예제

using System.Text.Json;
using System.Text.Unicode;

private JsonSerializerOptions JsonOption()
{
	// Json Option 설정
    return new JsonSerializerOptions()
    {
        Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
        PropertyNameCaseInsensitive = true,
    };
}


public void SerializeDeserialize()
{
	// 기본 옵션
    var jsonString = JsonSerializer.Serialize(Person.GetList());
    Console.WriteLine(jsonString);
    Console.WriteLine("----------------------------------------------");

	// 옵션 설정 
    var jsonStringOption = JsonSerializer.Serialize(Person.GetList(), JsonOption());
    Console.WriteLine(jsonStringOption);
    Console.WriteLine("----------------------------------------------");
    
    //  Deserialize Object
    var deserialize = JsonSerializer.Deserialize<List<Person>>(jsonString);
    
}

* 기본적으로 문자열을 escape 하지만 Encoder option 을 설정하여 escape 하지 않도록 할수 있다.

 

Serialize

 

Deserialize

 

 

JSON 구조의 데이터 Parsing 

Json Parse

 

Json 의 구조적 데이터는 아래와 같이 2개의 타입으로 정의된다.

JsonDocument 클래스 JSON 값의 구조를 검사 자세히 보기
JsonElement 구조체 JsonDocument 내에서 특정 JSON 값 자세히 보기

테스트 예제

public void JsonParse()
{
    var jsonStr = "[ {\"Name\":\"홍길동\",\"Address\":\"\"     ,\"Phone\":[]}," +
                    "{\"Name\":\"고길동\",\"Address\":\"seoul\",\"Phone\":[]}," +
                    "{\"Name\":\"남길동\",\"Address\":\"seoul\",\"Phone\":[]}," +
                    "{\"Name\":\"박길동\",\"Address\":\"busan\",\"Phone\":[\"1234 - 5678\",\"5678 - 4457\"]}," +
                    "{\"Name\":\"유길동\",\"Address\":\"suwon\",\"Phone\":[\"1124 - 1457\"]}" +
                    "]";

	// json 데이터를 JsonDocument 객체로 읽는다.
    JsonDocument json = JsonDocument.Parse(jsonStr);

    // Json 객체의 Root 요소를 가져온다.  
    var root = json.RootElement;

    // GetArrayLength 를 통해서 요소의 배열의 수를 가져올수 있으며, 
    // 요소가 배열이 아닌경우 System.InvalidOperationException  Error 가 발생
    Console.WriteLine(" root :  " + root.GetArrayLength());
    
    //EnumerateArray 배열형식의 값을 열거자로 가져온다.
    foreach (var element in root.EnumerateArray())
    {
    	// GetProperty 메소드를 통해서 value 값에 접근
        Console.WriteLine("json element");
        Console.WriteLine("   -> " + element);
        Console.WriteLine("   -> " + element.GetProperty("Name") +"," + element.GetProperty("Address"));
        Console.WriteLine("   -> " + element.GetProperty("Phone"));        
        Console.WriteLine("   -> " + element.ValueKind);	// 현재 요소의 타입정보

		// EnumerateObject Element의 들을 열거자 형태로 가져온다.
        foreach (var obj in element.EnumerateObject())
        {
            Console.WriteLine("        -> " + obj.ToString());
            Console.WriteLine("        -> " + obj.Name +"," + obj.Value + "," + obj.GetType().Name);
        }
    }
}

 

 

* Newtonsoft.Json 과의 차이점

1. case-sensitive(대소문자 구분) 하기 때문에 property에 대한 매치가 정확해야 한다. (기본옵션)

아래 예제를 보면 address, name 은 데이터 바인딩이 안된것을 확인할 수 있다.

var jsonStr = "[ {\"name\":\"박길동\",\"address\":\"busan\",\"Phone\":[\"1234 - 5678\",\"5678 - 4457\"]}," +
                "{\"name\":\"유길동\",\"address\":\"suwon\",\"Phone\":[\"1124 - 1457\"]}" +
                "]";

var deserialize = JsonSerializer.Deserialize<List<Person>>(jsonStr);

대소문자 구문하지 않고 매칭 하기 위해서는 PropertyNameCaseInsensitive 를 true 로 설정한다.

var options = new JsonSerializerOptions
{
    PropertyNameCaseInsensitive = true
};

 

JsonSerializerOptions 클래스 정보 보고

 

JsonSerializerOptions 클래스 (System.Text.Json)

JsonSerializer와 함께 사용할 옵션을 제공합니다.

learn.microsoft.com

 

System.Text.Json와 Newtonsoft.Json 비교 후 마이그레이션  자세히 보기

 

 

Newtonsoft.Json에서 System.Text.Json으로 마이그레이션 - .NET

Newtonsoft.Json에서 System.Text.Json으로 마이그레이션하는 방법을 알아봅니다. 샘플 코드가 포함되어 있습니다.

learn.microsoft.com

 

System.Text.Json을 사용하여 문자 인코딩을 사용자 지정하는 방법

 

System.Text.Json을 사용하여 문자 인코딩을 사용자 지정하는 방법

.NET에서 JSON으로 직렬화하고 JSON에서 역직렬화할 때 문자 인코딩을 사용자 지정하는 방법을 알아봅니다.

learn.microsoft.com

 

 

반응형