C# 今どきのjson(シリアライズ、デシリアライズ)

C#

オブジェクトのシリアライズ、デシリアライズNewtonsoft.Jsonがよく使われていました。

.NET Core 3.0 以降は、標準で搭載されたJSONライブラリのSystem.Text.Jsonが使えるようになりました。 パフォーマンスが高く、セキュリティ面でも優れているため、新しいプロジェクトはこちらが推奨されます。

シリアライズの使い方

例えばPersonクラスのインスタンスをAPIに渡したりファイルに保存したする場合にシリアライズを使います。

C#
using System;
using System.Text.Json;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

var person = new Person { Name = "John", Age = 30 };
string json = JsonSerializer.Serialize(person);
Console.WriteLine(json);

# {"Name":"John","Age":30}

デシリアライズの使い方

例えばjson形式になったPersonのインスタンスデータを元のPersonオブジェクトに復元するために使います。

C#
string json = "{\"Name\":\"John\",\"Age\":30}";
Person person = JsonSerializer.Deserialize<Person>(json);
Console.WriteLine($"{person.Name}, {person.Age}");
// 出力: Asnr, 30

オプションの指定

C#
var options = new JsonSerializerOptions
{
    WriteIndented = true,
    Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping
};

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

公式参照:JsonSerializerOptions クラス (System.Text.Json) | Microsoft Learn

.NET 8以降はより細かいオプション指定ができるようになりました。

C#
using System;
using System.Text.Json;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

var person = new Person { Name = "John", Age = 30 };

var options = new JsonSerializerOptions
{
    WriteIndented = true,
    IndentSize = 4, // インデント幅(スペースの数)
    IndentCharacter = '\t', // タブ文字を使う場合は '\t'、スペースなら ' '
    Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping
};

string json = JsonSerializer.Serialize(person, options);
Console.WriteLine(json);
  • IndentCharacterスペース ' ' またはタブ '\t' のみ対応しています。
  • IndentSize はスペースやタブの繰り返し数を指定します(例:スペース4つ分など)。
  • WriteIndented = true を指定しないと IndentCharacterIndentSize は無視されます。

プロパティ名のフォーマット変更

C#
var json = JsonSerializer.Serialize(new { FirstName = "John", Age = 30 });
Console.WriteLine(json);
// {"FirstName":"John","Age":30}

var options = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
};
json = JsonSerializer.Serialize(new { FirstName = "John", Age = 30 }, options);
Console.WriteLine(json);
// {"firstName":"John","age":30}

options = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower
};

json = JsonSerializer.Serialize(new { FirstName = "John", Age = 30 }, options);
Console.WriteLine(json);
// {"first_name":"John","age":30}

CamelCaseキャメルケース形式の名前付けポリシーを取得します。
KebabCaseLower小文字の kebab-casing の名前付けポリシーを取得します。
KebabCaseUpper大文字の kebab-casing の名前付けポリシーを取得します。
SnakeCaseLower小文字のスネーク大文字と小文字の名前付けポリシーを取得します。
SnakeCaseUpper大文字のスネーク大文字の名前付けポリシーを取得します。

公式参照:JsonSerializerOptions クラス (System.Text.Json) | Microsoft Learn

コメント

タイトルとURLをコピーしました