.netでJSONを扱う場合、Newtonsoft.JSONを使用するのが一般的であったが、dotnet core 3から、System.Text.Jsonネームスペースのライブラリが使用できるようになったので、試してみた。まず、シリアライズ(POCOからJSONへの変換)を試してみる。
↓のようなクラスインスタンスをJSONへ変換してみよう。
class Person {
public string Name { get; set; }
public DateTime Birthday { get; set; }
public List<MailAddress> Mail {get; set;}
[JsonIgnore] // シリアライズ時に無視する(JSONに吐き出さない)プロパティ
public int Age {
get => Period.Between(LocalDate.FromDateTime(Birthday),LocalDate.FromDateTime(DateTime.Now)).Years;
}
public override string ToString() {
string retstr = $"Name={Name}, Birthday={Birthday.ToString("yyyy/MM/dd")}({Age})";
foreach(var m in Mail) {
retstr += $"\r\n\t{m}";
}
return retstr;
}
}
class MailAddress {
public string Address {get; set;}
public string DisplayName { get; set; }
public override string ToString() {
return $"{DisplayName}<{Address}>";
}
}
インスタンスに値を設定して・・・
List<Person> personel = new List<Person>() {
new Person() {
Name = "T.Sumomo",
Birthday = DateTime.Parse("1964/02/03"),
Mail = new List<MailAddress>() {
new MailAddress() { Address = "t.sumomo@momo.com", DisplayName = "Taro Sumomo" },
new MailAddress() { Address = "t-sumomo@gmail.com", DisplayName = "すももから生まれたすもも太郎" }
}
},
new Person() {
Name = "J.Sumomo",
Birthday = DateTime.Parse("1976/12/13"),
Mail = new List<MailAddress>() {
new MailAddress() { Address = "j.sumomo@momo.com", DisplayName = "Jiro Sumomo" },
new MailAddress() { Address = "j-sumomo@live.com", DisplayName = "ジロー・チェインジ" }
}
},
new Person() {
Name = "S.Sumomo",
Birthday = DateTime.Parse("1989/06/25"),
Mail = new List<MailAddress>() {
new MailAddress() { Address = "s.sumomo@momo.com", DisplayName = "Sabro Sumomo" },
new MailAddress() { Address = "s-sumomo@hotmail.com", DisplayName = "すももサブロ~" }
}
}
};
シリアライズをする。
Console.WriteLine("Serialize");
// 結果にインデントを付けよう
var opt = new JsonSerializerOptions() {
WriteIndented = true
};
// シリアライズ
string jsonstr = JsonSerializer.Serialize(personel,opt);
Console.WriteLine($"JSON String={jsonstr}");
結果は
Serialize
JSON String=[
{
"Name": "T.Sumomo",
"Birthday": "1964-02-03T00:00:00",
"Mail": [
{
"Address": "t.sumomo@momo.com",
"DisplayName": "Taro Sumomo"
},
{
"Address": "t-sumomo@gmail.com",
"DisplayName": "\u3059\u3082\u3082\u304B\u3089\u751F\u307E\u308C\u305F\u3059\u3082\u3082\u592A\u90CE"
}
]
},
・・・
]
と、こんな形にシリアライズされる。
この、シリアライズされたJSONをデシリアライズ(JSON⇒POCO)してみる。
Console.WriteLine("Deserialize");
// 先ほどシリアライズしたJSONをデシリアライズ
var person = JsonSerializer.Deserialize<List<Person>>(jsonstr);
foreach(var p in person) {
Console.WriteLine(p);
}
結果は
Deserialize
Name=T.Sumomo, Birthday=1964/02/03(56)
Taro Sumomo<t.sumomo@momo.com>
すももから生まれたすもも太郎<t-sumomo@gmail.com>
Name=J.Sumomo, Birthday=1976/12/13(43)
Jiro Sumomo<j.sumomo@momo.com>
ジロー・チェインジ<j-sumomo@live.com>
Name=S.Sumomo, Birthday=1989/06/25(30)
Sabro Sumomo<s.sumomo@momo.com>
すももサブロ~<s-sumomo@hotmail.com>
このように、結構簡単にJSONを扱うことができる。
なお、シリアライズ/デシリアライズ以外にも、JsonDocumentを使用することで、DOMのようなアクセス方法も可能。
ちなみに、今回試したのは.NET 5 Preview 3。MSのドキュメントを見る限りでは.net core 3.0から使用できるはず。
後、下記usingを忘れずにね。
using System.Text.Json;
using System.Text.Json.Serialization;
細かいところまでは見ていないけど、簡単な使い方なら、Newtonsoft.JSONを置き換えることはできそうだね。
参考サイト JSON serialization and deserialization (marshalling and unmarshalling) in .NET – overview