C# で JSON を逆シリアル化するコード例の詳細解説
C# で JSON を逆シリアル化する方法
JSON は、JavaScript Object Notation の略で、データの交換形式として広く使用されています。 C# では、JSON をオブジェクトや辞書に変換する機能が提供されています。
Newtonsoft.Json ライブラリの使用
最も一般的な方法です。NuGet パッケージマネージャーから Newtonsoft.Json
をインストールします。
// NuGet パッケージマネージャーでインストール
Install-Package Newtonsoft.Json
// 使用例
using Newtonsoft.Json;
string jsonString = "{\"name\":\"John\", \"age\":30}";
// JSON 文字列をオブジェクトに変換
var person = JsonConvert.DeserializeObject<Person>(jsonString);
// JSON 文字列を辞書に変換
var dictionary = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonString);
// オブジェクトの定義
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
System.Text.Json ライブラリの使用
.NET Core 3.0 以降で標準ライブラリとして提供されています。
using System.Text.Json;
// JSON 文字列をオブジェクトに変換
var person = JsonSerializer.Deserialize<Person>(jsonString);
// JSON 文字列を辞書に変換
var dictionary = JsonSerializer.Deserialize<Dictionary<string, object>>(jsonString);
Manual Parsing
JSON の構造を理解している場合、手動で解析することもできます。しかし、複雑な JSON を扱う場合は、ライブラリを使用することをおすすめします。
注意:
- オブジェクトや辞書に変換する際には、JSON の構造と C# のクラスや辞書の構造が一致している必要があります。
- JSON のキーが数値の場合、辞書への変換で問題が発生する可能性があります。適切なデータ型を使用してください。
C# で JSON を逆シリアル化するコード例の詳細解説
using Newtonsoft.Json;
string jsonString = "{\"name\":\"John\", \"age\":30}";
// JSON 文字列をオブジェクトに変換
var person = JsonConvert.DeserializeObject<Person>(jsonString);
// JSON 文字列を辞書に変動
var dictionary = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonString);
// オブジェクトの定義
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
using Newtonsoft.Json;
: Newtonsoft.Json ライブラリを使用するために、この名前空間をインポートします。string jsonString
: JSON形式の文字列を定義します。この例では、名前と年齢を持つ人物を表すJSONです。var person = JsonConvert.DeserializeObject<Person>(jsonString);
:JsonConvert.DeserializeObject<Person>(jsonString)
: JSON文字列を、Person
型のオブジェクトに逆シリアル化します。Person
クラスは、JSONの構造に対応するプロパティ(Name, Age)を持っています。
var dictionary = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonString);
:- JSON文字列を、キーが文字列、値が任意のオブジェクト型の辞書に逆シリアル化します。
- JSONの構造が複雑な場合や、事前にオブジェクトの型がわからない場合に便利です。
using System.Text.Json;
// JSON 文字列をオブジェクトに変換
var person = JsonSerializer.Deserialize<Person>(jsonString);
// JSON 文字列を辞書に変換
var dictionary = JsonSerializer.Deserialize<Dictionary<string, object>>(jsonString);
JsonSerializer.Deserialize<Person>(jsonString)
: Newtonsoft.Jsonと同様に、JSON文字列をPerson
型のオブジェクトに逆シリアル化します。JsonSerializer.Deserialize<Dictionary<string, object>>(jsonString)
: JSON文字列を辞書に逆シリアル化します。
各コードのポイント
- オブジェクトへの変換:
- JSONの各プロパティに対応する、C#のクラスのプロパティを定義します。
DeserializeObject
メソッドのジェネリック型引数に、そのクラスを指定します。
- 辞書への変換:
- キーは文字列、値は任意のオブジェクト型になります。
- ライブラリの選択:
- Newtonsoft.Json: 機能が豊富で、柔軟性が高い。
- System.Text.Json: .NET Core 3.0以降で標準ライブラリとして提供され、パフォーマンスが良い。
- カスタム変換:
- シリアル化設定:
- エラー処理:
C#でJSONを逆シリアル化するには、Newtonsoft.JsonやSystem.Text.Jsonなどのライブラリを使用します。JSONの構造に合わせてC#のクラスを定義し、DeserializeObject
やDeserialize
メソッドで逆シリアル化を行います。辞書に変換したい場合は、ジェネリック型引数にDictionary<string, object>
を指定します。
DataContractJsonSerializer の使用 (推奨されません)
.NET Frameworkの古いバージョンから存在するクラスですが、System.Text.Json が推奨されるため、新しいプロジェクトでは使用を避けるべきです。
using System.Runtime.Serialization.Json;
// JSON 文字列をオブジェクトに変換
var person = new DataContractJsonSerializer(typeof(Person)).ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(jsonString))) as Person;
- 特徴:
- DataContractAttributeでマークされたクラスのプロパティをシリアル化/逆シリアル化します。
- System.Text.Jsonよりも柔軟性が低い場合があります。
JavaScriptSerializer の使用 (推奨されません)
ASP.NET Web Formsで使用されていたクラスですが、.NET Coreではサポートされていません。
using System.Web.Script.Serialization;
// JSON 文字列をオブジェクトに変換
var person = new JavaScriptSerializer().Deserialize<Person>(jsonString);
- 特徴:
手動パース
JSONの構造を深く理解している場合、JsonReader
クラスなどを利用して手動でパースすることも可能です。
using Newtonsoft.Json.Linq;
// JSON文字列をJObjectに変換
JObject json = JObject.Parse(jsonString);
// プロパティの値を取得
string name = (string)json["name"];
int age = (int)json["age"];
- 特徴:
- 柔軟性が高いですが、実装が複雑になります。
- 特定のJSON構造に特化した処理を行う場合に有効です。
LINQ to JSON
Newtonsoft.Jsonが提供するLINQ to JSONは、JSONデータをLINQのクエリで操作できる機能です。
// 上記の手動パースの例と同様
- 特徴:
- Json.NET: Newtonsoft.Jsonの別名で、最も広く使用されているJSONライブラリです。
- Utf8Json: 高速なシリアル化/逆シリアル化が特徴のライブラリです。
- System.Text.Json.Serialization: System.Text.Jsonのカスタムコンバーターを作成するための機能です。
System.Text.Json が.NET Core以降で推奨される標準ライブラリであり、パフォーマンスや機能面で優れています。特別な理由がない限り、System.Text.Jsonを使用することをおすすめします。
どの方法を選ぶべきか
- シンプルで一般的なケース: System.Text.Json
- 高度なカスタマイズが必要な場合: Newtonsoft.Json、System.Text.Json.Serialization
- パフォーマンスが特に重要な場合: Utf8Json
- レガシーなプロジェクト: DataContractJsonSerializer(ただし、新しいプロジェクトでは避けるべき)
選択のポイント
- パフォーマンス: どの程度のパフォーマンスが必要か
- 機能: カスタム変換、LINQ to JSONなどの機能が必要か
- コミュニティ: ライブラリのサポート状況やコミュニティの活発さ
- プロジェクトの制約: 既存のコードとの整合性、ライセンスなど
- JSONの構造: JSONの構造とC#のクラスの構造が一致している必要があります。
- エラー処理: JSONの形式が不正な場合、例外が発生します。適切なエラー処理を行いましょう。
c# json dictionary