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