3
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

C# で Json を扱う

Posted at

はじめに

以前は Newtonsoft.Json を使っていたが、現在は System.Core3.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;

参考にしたサイトなど

3
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?