方法 : JSON データをシリアル化および逆シリアル化する

JSON (JavaScript Object Notation) は、クライアント ブラウザーと AJAX 対応の Web サービスとの間で、少量のデータを高速に交換できる効率的なデータ エンコード形式です。

ここでは、DataContractJsonSerializer を使用して .NET 型のオブジェクトを JSON エンコードされたデータにシリアル化し、この JSON 形式のデータを .NET 型のインスタンスに戻すために逆シリアル化する方法について説明します。この例では、ユーザー定義された Person 型のシリアル化と逆シリアル化を示すためにデータ コントラクトを使用します。

AJAX 対応エンドポイントで公開されたサービス操作でデータ コントラクト型を使用する場合、JSON でのシリアル化および逆シリアル化は通常 Windows Communication Foundation (WCF) によって自動的に処理されます。ただし、特定の場合においては JSON データを直接処理する必要があります。このトピックでは、このようなシナリオについて説明します。

Bb412179.note(ja-jp,VS.100).gif注 :
サーバー上で送信応答のシリアル化中にエラーが発生した場合、または応答操作がなんらかの理由で例外をスローした場合、エラーにより応答がクライアントに戻らないことがあります。

このトピックは、「JSON シリアル化」のサンプルに基づいています。

Person のデータ コントラクトを定義するには

  1. クラスに DataContractAttribute をアタッチし、シリアル化するメンバーに DataMemberAttribute 属性をアタッチすることで、Person のデータ コントラクトを定義します。データ コントラクト詳細情報、「サービス コントラクトの設計」を参照してください。

    [DataContract]
        internal class Person
        {
            [DataMember]
            internal string name;
    
            [DataMember]
            internal int age;
        }
    

Person 型のインスタンスを JSON にシリアル化するには

  1. Person 型のインスタンスを作成します。

    Person p = new Person();
    p.name = "John";
    p.age = 42;
    
  2. DataContractJsonSerializer を使用して、Person オブジェクトをメモリ ストリームにシリアル化します。

    MemoryStream stream1 = new MemoryStream();
    DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Person));
    
  3. JSON データをストリームに書き込むには、WriteObject メソッドを使用します。

    ser.WriteObject(stream1, p);
    
  4. JSON の出力を表示します。

    stream1.Position = 0;
    StreamReader sr = new StreamReader(stream1);
    Console.Write("JSON form of Person object: ");
    Console.WriteLine(sr.ReadToEnd());
    

JSON から Person 型のインスタンスに逆シリアル化するには

  1. DataContractJsonSerializerReadObject メソッドを使用して、JSON エンコードされたデータを Person の新しいインスタンスに逆シリアル化します。

    stream1.Position = 0;
    Person p2 = (Person)ser.ReadObject(stream1);
    
  2. 結果を表示します。

    Console.Write("Deserialized back, got name=");
    Console.Write(p2.name);
    Console.Write(", age=");
    Console.WriteLine(p2.age);
    

Bb412179.note(ja-jp,VS.100).gif注 :
JSON シリアライザーは、次のサンプル コードに示すように、データ コントラクターの複数のメンバーが同じ名前である場合、シリアル化例外をスローします。

[DataContract]
public class TestDuplicateDataBase
{
    [DataMember]
    public int field1 = 123;
}
[DataContract]
public class TestDuplicateDataDerived : TestDuplicateDataBase
{
    [DataMember]
    public new int field1 = 999;
}

参照

概念

スタンドアロン JSON のシリアル化
JSON などのデータ転送形式のサポート