JSON
지원 클래스의 default 는 NewtonSoft.json
이었으나 System.Text.Json
으로 변경되었다. json dom
으로 만들고 json요소를 자유롭게 navigation
할 수 있는 기능System.Text.Json
네임스페이스에는 또한 utf-8
으로 인코딩된 json바이트들을 읽을 수 있는 UTF8JsonReader
클래스, 반대로 쓰기 기능을 하는 Utf8JsonWriter
클래스가 제공되고 있다.static void Main(string[] args){
// 직렬화
Person person = new Person { Id=1, Name="Alex" };
string jsonPerson = JsonSerializer.Serialize(person);
Console.WriteLine(jsonPerson);
// 문자열로 직렬화된 거 출력 "{\"Id\":1,\"Name\":\"Alex\"}"
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}");
string jsonString =
}
public class Person{
public int Id{get;set;}
public string Name{get;set;}
}
큰 json 데이터
를 사용할 때 일부 요소만 필요한 경우가 있다.
이러한 경우에 역직렬화
를 통해서 전체를 객체로 변환하는 것보다 json dom을 사용하여 필요한 요소만 발췌하는 것이 편하다.
특히 json dom
을 사용하면, 역직렬화에서 사용할 객체의 클래스를 C#에서 정의하지 않아도 된다.
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);