상세 컨텐츠

본문 제목

[.NET] Json 직렬화 및 역직렬화

.NET

by 코딩하는 박줄기 2022. 10. 10. 00:07

본문

728x90
반응형

System.Text.Json 네임스페이스는 JSON(JavaScript Object Notation)에서 직렬화 및 역직렬화하는 기능을 제공합니다. .NET Core 3.1 이상 버전의 런타임에 포함되어 있습니다. 다른 대상 프레임워크의 경우 System.Text.Json NuGet 패키지를 설치해야합니다. 아래 버전에서 지원합니다.

  • .NET Standard 2.0 이상 버전
  • .NET Framework 4.7.2 이상 버전
  • .NET Core 2.0, 2.1, 2.2

 

준비

using System.Text.Json;
using System.Text.Encodings.Web;
using System.Text.Unicode;

//System.Text.Json에는 모든 진입점과 기본 형식이 포함되어 있습니다.

 

직렬화 예제(개체를 JSON으로)

문자열 또는 파일에 JSON을 쓰려면 JsonSerializer.Serialize 메서드를 호출합니다.

     A. 기본

var dic = new Dictionary<string, string>()
{
    { "name", "jinwoo" },
    { "favoritefodd", "beef" }
};

string jsonString = JsonSerializer.Serialize(dic);
Console.WriteLine(jsonString);

//output :
{"name":"jinwoo","favoritefodd":"beef"}

   B. JSON을 보기 좋게 출력

var options = new JsonSerializerOptions
{
    //WriteIndented : 사용자 가독성을 위해 JSON의 서식을 지정하는 옵션
    WriteIndented = true 
};

var dic = new Dictionary<string, string>()
{
    { "Name", "Jinwoo" },
    { "Favoritefodd", "beef" }
};

string jsonString = JsonSerializer.Serialize(dic, options);
Console.WriteLine(jsonString);

//output : 
{
  "Name": "Jinwoo",
  "Favoritefodd": "beef"
}

     C. 한글 사용

var options = new JsonSerializerOptions
{
    //문자 인코딩을 사용자 지정, BasicLatin : 로마자 기본, HangulSyllables : 한글 음절
    Encoder = JavaScriptEncoder.Create(UnicodeRanges.BasicLatin, UnicodeRanges.HangulSyllables),
};

var dic = new Dictionary<string, string>()
{
    { "Name", "진우" },
    { "Favoritefodd", "소고기" }
};

string jsonString = JsonSerializer.Serialize(dic, options);
Console.WriteLine(jsonString);

//output : 
{"Name":"진우","Favoritefodd":"소고기"}

     D. 개채를 Json

var options = new JsonSerializerOptions
{
    Encoder = JavaScriptEncoder.Create(UnicodeRanges.BasicLatin, UnicodeRanges.HangulSyllables),
    WriteIndented = true
};

Person person = new Person()
{
    Name = "박진우",
    Age = DateTime.Now.Year - 1994,
    Nickname = new string[] { "원빈", "장동건", "현빈" },
    Favoritefood = new List<string>() { "소고기", "돼지고기", "닭고기"},
    Birthday = DateTime.Parse("1994-08-09"),
    Employed = true
};

string jsonString = JsonSerializer.Serialize(person, options);
Console.WriteLine(jsonString);

//output : 
{
  "Name": "박진우",
  "Age": 28,
  "Nickname": [
    "원빈",
    "장동건",
    "현빈"
  ],
  "Favoritefood": [
    "소고기",
    "돼지고기",
    "닭고기"
  ],
  "Birthday": "1994-08-09T00:00:00+09:00",
  "Employed": true
}

 

역직렬화 예제(JSON을 개체로 읽는 방법)

JSON을 역직렬화하는 일반적인 방법은 하나 이상의 JSON 속성을 나타내는 속성 및 필드가 있는 클래스를 만들고 문자열 또는 파일에서 역직렬화 메서드를 호출합니다(JsonSerializer.Deserialize). 클래스에 표시되지 않는 JSON 속성은 무시됩니다. 

     A. 역직렬화

string jsonString = @"
{
  ""Name"": ""박진우"",
  ""Age"": 28,
  ""Nickname"": [
    ""원빈"",
    ""장동건"",
    ""현빈""
  ],
  ""Favoritefood"": [
    ""소고기"",
    ""돼지고기"",
    ""닭고기""
  ],
  ""Birthday"": ""1994-08-09T00:00:00+09:00"",
  ""Employed"": true
}
";

Person Person = JsonSerializer.Deserialize<Person>(jsonString);

Console.WriteLine(Person.Name);
Console.WriteLine(Person.Age);
Console.WriteLine(Person.Birthday);
Console.WriteLine(Person.Employed);

//output : 
박진우
28
1994-08-09 00:00:00 +09:00
True

 

JsonNode (역직렬화할 클래스가 없는 경우)

역직렬화하려는 JSON이 있고 역직렬화할 클래스가 없는 경우 또는 수신하는 JSON에 고정된 스키마가 없는 경우 해당 스키마가 포함된 내용을 알기 위해 검사할때 사용할 수 있습니다.

using System.Text.Json.Nodes;

string jsonString = @"
{
  ""Name"": ""박진우"",
  ""Age"": 28,
  ""Nickname"": [
    ""원빈"",
    ""장동건"",
    ""현빈""
  ],
  ""Favoritefood"": [
    ""소고기"",
    ""돼지고기"",
    ""닭고기""
  ],
  ""Birthday"": ""1994-08-09T00:00:00+09:00"",
  ""Employed"": true
}
";

JsonNode jsonNode = JsonNode.Parse(jsonString);

Console.WriteLine(jsonNode.ToJsonString(options));
Console.WriteLine(jsonNode["Name"]);
Console.WriteLine(jsonNode["Age"]);
Console.WriteLine(jsonNode["Nickname"]);
Console.WriteLine(jsonNode["Favoritefood"].ToJsonString(options));
Console.WriteLine(jsonNode["Birthday"]);
Console.WriteLine(jsonNode["Employed"]);

//output : 
박진우
28
[
  "\uC6D0\uBE48",
  "\uC7A5\uB3D9\uAC74",
  "\uD604\uBE48"
]
[
  "소고기",
  "돼지고기",
  "닭고기"
]
1994-08-09T00:00:00+09:00
true

 

 

 

참조

728x90
반응형

관련글 더보기

댓글 영역