System.Text.Jsonネームスペース

.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

takezou について

ソフトウェア開発会社(ITと言う言葉は大嫌い)で働く、元技術者。 未だに、社内システム位は作ってますが・・・ プログラミング言語はC#が好き。
カテゴリー: C#, dotnetcore, 技術系 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください