方法: JSON データのシリアル化と逆シリアル化How to: Serialize and deserialize JSON data

JSON (JavaScript Object Notation) は、クライアント ブラウザーと AJAX 対応の Web サービスとの間で、少量のデータを高速に交換できる効率的なデータ エンコード形式です。JSON (JavaScript Object Notation) is an efficient data encoding format that enables fast exchanges of small amounts of data between client browsers and AJAX-enabled Web services.

この記事では、.NET 型オブジェクトを JSON エンコードされたデータにシリアル化し、JSON 形式のデータを .NET 型のインスタンスに逆シリアル化する方法について説明します。This article demonstrates how to serialize .NET type objects into JSON-encoded data and then deserialize data in the JSON format back into instances of .NET types. この例では、データコントラクトを使用して、ユーザー定義Person型のシリアル化と逆シリアル化を示し、を使用DataContractJsonSerializerします。This example uses a data contract to demonstrate serialization and deserialization of a user-defined Person type and uses DataContractJsonSerializer.

通常、AJAX 対応のエンドポイントで公開されるサービス操作でデータコントラクト型を使用する場合、JSON のシリアル化と逆シリアル化は、Windows Communication Foundation (WCF) によって自動的に処理されます。Normally, JSON serialization and deserialization are handled automatically by Windows Communication Foundation (WCF) when you use data contract types in service operations that are exposed over AJAX-enabled endpoints. ただし、場合によっては、JSON データを直接操作する必要があります。However, in some cases you may need to work with JSON data directly.

注意

サーバー上の送信応答のシリアル化中または他の何らかの理由でエラーが発生した場合、エラーとしてクライアントに返されないことがあります。If an error occurs during serialization of an outgoing reply on the server or for some other reason, it may not get returned to the client as a fault.

この記事は、 JSON シリアル化のサンプルに基づいています。This article is based on the JSON serialization sample.

個人の種類のデータコントラクトを定義するにはTo define the data contract for a Person type

  1. クラスに Person をアタッチし、シリアル化するメンバーに DataContractAttribute 属性をアタッチすることで、DataMemberAttribute のデータ コントラクトを定義します。Define the data contract for Person by attaching the DataContractAttribute to the class and DataMemberAttribute attribute to the members you want to serialize. データコントラクトの詳細については、「サービスコントラクトの設計」を参照してください。For more information about data contracts, see Designing service contracts.

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

Person 型のインスタンスを JSON にシリアル化するにはTo serialize an instance of type Person to JSON

  1. Person 型のインスタンスを作成します。Create an instance of the Person type.

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

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

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

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

JSON から Person 型のインスタンスに逆シリアル化するにはTo deserialize an instance of type Person from JSON

  1. PersonReadObject メソッドを使用して、JSON エンコードされたデータを DataContractJsonSerializer の新しいインスタンスに逆シリアル化します。Deserialize the JSON-encoded data into a new instance of Person by using the ReadObject method of the DataContractJsonSerializer.

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

    Console.WriteLine($"Deserialized back, got name={p2.name}, age={p2.age}");  
    

Example

// 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 シリアライザーは、次のサンプル コードに示すように、データ コントラクターの複数のメンバーが同じ名前である場合、シリアル化例外をスローします。The JSON serializer throws a serialization exception for data contracts that have multiple members with the same name, as shown in the following sample code.

[DataContract]  
public class TestDuplicateDataBase  
{  
    [DataMember]  
    public int field1 = 123;  
}

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

関連項目See also