Share via


HOW TO:序列化及還原序列化 JSON 資料

JSON (JavaScript 物件標記法) 是一種有效率的資料編碼格式,可以在用戶端瀏覽器與啟用 AJAX 的 Web 服務之間啟用快速的小量資料交換作業。

本主題示範如何將 .NET 型別物件序列化為 JSON 編碼資料,然後透過 DataContractJsonSerializer,將 JSON 格式的資料還原序列化為 .NET 型別執行個體。這個範例會使用資料合約來示範使用者定義之 Person 型別的序列化與還原序列化。

一般來說,當您在啟用 AJAX 的端點上所公開的服務作業中使用資料合約類型時,Windows Communication Foundation (WCF) 會自動處理 JSON 序列化和還原序列化。但是,在某些情況下您可能需要直接使用 JSON 資料,而本主題就是要示範這種情況。

Bb412179.note(zh-tw,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. 使用 WriteObject 方法,將 JSON 資料寫入資料流。

    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(zh-tw,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 和其他資料傳輸格式的支援