はじめに
以前は Newtonsoft.Json
を使っていたが、現在は System.Core
の 3.0
以降であれば System.Text.Json
があるとの事。
System.Text.Json 名前空間 | Microsoft Docs
とりあえず実際に使った内容などの覚書のため、今後新たに知った事は追記して行く。
記事記載時の環境など
Microsoft Visual Studio Community 2019
Version 16.6.3
Windows Forms App(.NET Core)
.NET Framework
での場合、NuGetパッケージからインストールする必要があるので Json
なりで検索して System.Text.Json
をインストールする。
基本
次のようなクラスがあったとする。
public class Hoge
{
public int id { get; set; }
public string name { get; set; }
}
Jsonの内容は次の通り。
hoge.json
{
"id": 1,
"name": "hoge"
}
JSONデータをクラスに取り込む(デシリアライズ)
using System.Text.Json;
var json = File.ReadAllText(@"C:\hoge.json");
var hoge = JsonSerializer.Deserialize<Hoge>(json);
クラスの内容をJSON文字列にする(シリアライズ)
using System.Text.Json;
var hoge = new Hoge();
hoge.id = 1;
hoge.name = "hoge";
var json = JsonSerializer.Serialize<Hoge>(hoge);
File.WriteAllText(@"C:\hoge.json", json);
オプション指定について
必要に応じて組合せて使用する。
enum を扱えるようにする(enum を文字列として扱う)
public enum HogeType
{
HOGE,
GEHO
}
public class Hoge
{
public HogeType type { get; set; }
public int id { get; set; }
public string name { get; set; }
}
using System.Text.Json;
using System.Text.Json.Serialization;
var options = new JsonSerializerOptions();
options.Converters.Add(new JsonStringEnumConverter());
// デシリアライズ
var hoge = JsonSerializer.Deserialize<Hoge>(File.ReadAllText(@"C:\hoge.json"), options);
// シリアライズ
var json = JsonSerializer.Serialize<Hoge>(hoge, options);
File.WriteAllText(@"C:\hoge.json", json);
オプション未指定時
{"type":0,"id":1,"name":"hoge"}
オプション指定時
{"type":"HOGE","id":1,"name":"hoge"}
文字をエスケープしない
通常、シリアライズすると次のよう日本語などはエスケープされる。
var hoge = new Hoge();
hoge.type = HogeType.HOGE;
hoge.id = 1;
hoge.name = "ほげ";
var json = JsonSerializer.Serialize<Hoge>(hoge);
File.WriteAllText(@"C:\hoge.json", json);
hoge.json
{"type":0,"id":1,"name":"\u307B\u3052"}
次のオプション指定を行う。
using System.Text.Json;
using System.Text.Encodings.Web;
using System.Text.Unicode;
var options = new JsonSerializerOptions();
options.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
var json = JsonSerializer.Serialize<Hoge>(hoge, options);
File.WriteAllText(@"C:\hoge.json", json);
hoge.json
{"type":0,"id":1,"name":"ほげ"}
結果をフォーマットする(インデントする)
options.WriteIndented = true;