DataContractJsonSerializer を使用する方法
Note
この記事では、DataContractJsonSerializer について説明します。 JSON のシリアル化と逆シリアル化が関連するほとんどのシナリオでは、System.Text.Json 名前空間の API をお勧めします。
JSON (JavaScript Object Notation) は、クライアント ブラウザーと AJAX 対応の Web サービスとの間で、少量のデータを高速に交換できる効率的なデータ エンコード形式です。
この記事では、.NET 型のオブジェクトを JSON エンコードされたデータにシリアル化し、この JSON 形式のデータを .NET 型のインスタンスに戻すために逆シリアル化する方法について説明します。 この例では、ユーザー定義された Person
型のシリアル化と逆シリアル化を示すためにデータ コントラクトを使用し、DataContractJsonSerializer を使用します。
AJAX 対応エンドポイントで公開されたサービス操作でデータ コントラクト型を使用する場合、JSON でのシリアル化および逆シリアル化は通常 Windows Communication Foundation (WCF) によって自動的に処理されます。 ただし、場合によっては、JSON データを直接処理する必要があります。
この記事は、DataContractJsonSerializer サンプルが基になっています。
Person 型用のデータ コントラクトを定義するには
クラスに
Person
をアタッチし、シリアル化するメンバーに DataContractAttribute 属性をアタッチすることで、DataMemberAttribute のデータ コントラクトを定義します。 データ コントラクトの詳細については、「サービス コントラクトの設計」を参照してください。[DataContract] internal class Person { [DataMember] internal string name; [DataMember] internal int age; }
Person 型のインスタンスを JSON にシリアル化するには
Note
サーバー上で送信応答のシリアル化中に、または他のなんらかの理由で、エラーが発生した場合は、エラーにより応答がクライアントに戻らないことがあります。
Person
型のインスタンスを作成します。var p = new Person(); p.name = "John"; p.age = 42;
DataContractJsonSerializer を使用して、
Person
オブジェクトをメモリ ストリームにシリアル化します。var stream1 = new MemoryStream(); var ser = new DataContractJsonSerializer(typeof(Person));
JSON データをストリームに書き込むには、WriteObject メソッドを使用します。
ser.WriteObject(stream1, p);
JSON の出力を表示します。
stream1.Position = 0; var sr = new StreamReader(stream1); Console.Write("JSON form of Person object: "); Console.WriteLine(sr.ReadToEnd());
JSON から Person 型のインスタンスに逆シリアル化するには
Person
の ReadObject メソッドを使用して、JSON エンコードされたデータを DataContractJsonSerializer の新しいインスタンスに逆シリアル化します。stream1.Position = 0; var p2 = (Person)ser.ReadObject(stream1);
結果を表示します。
Console.WriteLine($"Deserialized back, got name={p2.name}, age={p2.age}");
例
// Create a User object and serialize it to a JSON stream.
public static string WriteFromObject()
{
// Create User object.
var user = new User("Bob", 42);
// Create a stream to serialize the object to.
var ms = new MemoryStream();
// Serializer the User object to the stream.
var ser = new DataContractJsonSerializer(typeof(User));
ser.WriteObject(ms, user);
byte[] json = ms.ToArray();
ms.Close();
return Encoding.UTF8.GetString(json, 0, json.Length);
}
// Deserialize a JSON stream to a User object.
public static User ReadToObject(string json)
{
var deserializedUser = new User();
var ms = new MemoryStream(Encoding.UTF8.GetBytes(json));
var ser = new DataContractJsonSerializer(deserializedUser.GetType());
deserializedUser = ser.ReadObject(ms) as User;
ms.Close();
return deserializedUser;
}
注意
JSON シリアライザーは、次のサンプル コードに示すように、データ コントラクターの複数のメンバーが同じ名前である場合、シリアル化例外をスローします。
[DataContract]
public class TestDuplicateDataBase
{
[DataMember]
public int field1 = 123;
}
[DataContract]
public class TestDuplicateDataDerived : TestDuplicateDataBase
{
[DataMember]
public new int field1 = 999;
}