System.Text.Json
.NET Core 3.0에서 새로운 Json 지원 클래스로서 System.Text.Json가 내장(built-in) 되었으며, ASP.NET Core 3.0 에서 디폴트 Json Serializer가 서드파티의 Newtonsoft.Json에서 System.Text.Json 으로 변경되었다.
.NET Core가 아닌 .NET Framework 혹은 .NET Standard을 사용하는 경우에는, Nuget에서 System.Text.Json 패키지를 설치하여 사용할 수 있다.
.NET Core가 아닌 .NET Framework 혹은 .NET Standard을 사용하는 경우에는, Nuget에서 System.Text.Json 패키지를 설치하여 사용할 수 있다.
System.Text.Json 기능
System.Text.Json은 빠르고 성능이 뛰어나며, 적은 메모리를 사용하는 것으로 알려져 있다.
System.Text.Json 네임스페이스는 JsonSerializer 클래스를 통해 C# 객체를 Json 문자열로 변경하는 Serialization과 Json 문자열을 C# 객체로 복원하는 Deserialization 기능을 제공하고, 또한 JsonDocument와 JsonElement 클래스를 통해 Json 문자열을 메모리 상에서 Json DOM(Document Object Model)으로 만들고 Json 요소를 자유롭게 Navigation 할 수 있는 기능을 제공한다.
System.Text.Json 네임스페이스에는 또한 UTF-8으로 인코딩된 Json 바이트들을 읽을 수 있는 Utf8JsonReader 클래스와 반대로 쓰기 기능을 하는 Utf8JsonWriter 클래스가 제공되고 있다.
System.Text.Json 네임스페이스는 JsonSerializer 클래스를 통해 C# 객체를 Json 문자열로 변경하는 Serialization과 Json 문자열을 C# 객체로 복원하는 Deserialization 기능을 제공하고, 또한 JsonDocument와 JsonElement 클래스를 통해 Json 문자열을 메모리 상에서 Json DOM(Document Object Model)으로 만들고 Json 요소를 자유롭게 Navigation 할 수 있는 기능을 제공한다.
System.Text.Json 네임스페이스에는 또한 UTF-8으로 인코딩된 Json 바이트들을 읽을 수 있는 Utf8JsonReader 클래스와 반대로 쓰기 기능을 하는 Utf8JsonWriter 클래스가 제공되고 있다.
Json Serialization과 Deserialization
System.Text.Json.JsonSerializer 클래스에는 C# 클래스 인스턴스를 Json 문자열로 Serialization하는 Serialize() 메서드와 반대로 Json 문자열을 C# 클래스 인스턴스로 Deserialization하는 Deserialize() 메서드가 있다.
JsonSerializer.Serialize() 혹은 JsonSerializer.Deserialize() 메서드는 정적메서드이고, 필요한 경우 추가적으로 JsonSerializerOptions 옵션을 지정할 수 있다.
JsonSerializer.Serialize() 혹은 JsonSerializer.Deserialize() 메서드는 정적메서드이고, 필요한 경우 추가적으로 JsonSerializerOptions 옵션을 지정할 수 있다.
예제
static void Main(string[] args)
{
// Serialize
Person person = new Person { Id = 1, Name = "Alex" };
string jsonPerson = JsonSerializer.Serialize(person);
Console.WriteLine(jsonPerson);
// Deserialize
var jsonOptions = new JsonSerializerOptions
{
WriteIndented = true
};
string jsonString = "{\"Id\":1,\"Name\":\"Alex\"}";
var personObj = JsonSerializer.Deserialize<Person>(jsonString, jsonOptions);
Console.WriteLine($"{personObj.Id}, {personObj.Name}");
}
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
}
{
// Serialize
Person person = new Person { Id = 1, Name = "Alex" };
string jsonPerson = JsonSerializer.Serialize(person);
Console.WriteLine(jsonPerson);
// Deserialize
var jsonOptions = new JsonSerializerOptions
{
WriteIndented = true
};
string jsonString = "{\"Id\":1,\"Name\":\"Alex\"}";
var personObj = JsonSerializer.Deserialize<Person>(jsonString, jsonOptions);
Console.WriteLine($"{personObj.Id}, {personObj.Name}");
}
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
}
Json DOM 사용하기
Json 데이타를 사용할 때 큰 Json 데이타 중 일부 요소만 필요로 하는 경우도 있는데, 이러한 경우 Deserialization을 통해 전체를 객체로 변환하는 것보다 Json DOM을 사용하여 필요한 요소만 발췌하는 것이 편리할 것이다. 특히, Json DOM을 사용하면, Deserialization에서 사용할 객체의 클래스를 C#에서 정의하지 않아도 된다.
System.Text.Json에서 JsonDocument 클래스는 문자열이나 UTF-8 바이트배열로부터 Json DOM을 생성하는데 사용하고, DOM 안의 각각의 요소는 JsonElement 클래스를 통해 엑세스한다. JsonElement의 GetProperty() 메서드는 속성명에 상응하는 요소(JsonElement)를 리턴하는데, 이 요소는 문자열이나 숫자 같은 기초 데이타 타입일 수도 있고, Json 객체 혹은 Json 배열과 같은 타입일 수 있다. JsonElement에는 다양한 기초 데이타 타입의 값을 읽어내는 여러 Get* 메서드(예: GetString(), GetInt32())들이 있다.
System.Text.Json에서 JsonDocument 클래스는 문자열이나 UTF-8 바이트배열로부터 Json DOM을 생성하는데 사용하고, DOM 안의 각각의 요소는 JsonElement 클래스를 통해 엑세스한다. JsonElement의 GetProperty() 메서드는 속성명에 상응하는 요소(JsonElement)를 리턴하는데, 이 요소는 문자열이나 숫자 같은 기초 데이타 타입일 수도 있고, Json 객체 혹은 Json 배열과 같은 타입일 수 있다. JsonElement에는 다양한 기초 데이타 타입의 값을 읽어내는 여러 Get* 메서드(예: GetString(), GetInt32())들이 있다.
예제
// Json DOM
string jsonString = "{\"Id\":1,\"Address\":{\"Zip\":\"98052\",\"State\":\"WA\"}}";
JsonDocument jdom = JsonDocument.Parse(jsonString);
JsonElement jroot = jdom.RootElement;
JsonElement jaddr = jroot.GetProperty("Address");
string zip = jaddr.GetProperty("Zip").GetString();
Console.WriteLine(zip);
string jsonString = "{\"Id\":1,\"Address\":{\"Zip\":\"98052\",\"State\":\"WA\"}}";
JsonDocument jdom = JsonDocument.Parse(jsonString);
JsonElement jroot = jdom.RootElement;
JsonElement jaddr = jroot.GetProperty("Address");
string zip = jaddr.GetProperty("Zip").GetString();
Console.WriteLine(zip);