Serialization

Serialization

今天分享兩種將取得的JSON轉換成強型別的方式。

JavaScriptSerializer

  • 使用JavaScriptSerializer反序列化JSON字串,會對應到欄位名稱自動mapping為強型別物件。
public class Product
{

    public int ProductId { get; set; }
    
    public string ProductName { get; set; }

    public Nullable<decimal> Price { get; set; }

    public Nullable<bool> Active { get; set; }

    public Nullable<decimal> Stock { get; set; }

}
static void Main(string[] args)
{    
    var url = new Uri("http://localhost:5109/Api/Products/1558");
    var client = new WebClient();

    // 讀取JSON字串 
    // {"ProductId":1558,"ProductName":"Miles","Price":200.0000,"Active":true,"Stock":2.000}
    var json = client.DownloadString(url);
        
    var serializer = new JavaScriptSerializer();
    // 將 JSON字串反序列化成Product物件
    var data = serializer.Deserialize<Product>(json);

    Console.WriteLine(data.ProductName);   
}

DataContractJsonSerializer

  • 使用DataContract比較特別,要先定義哪一個class要被反序列化,以及哪一個Property可被序列化或反序列化。  但是使用DataContract多種功能可以使用,例如強制某一個Property為必要值,如果傳過來的JSON沒有該欄位,則會throw Exception。 或者也可以設定 JSON欄位名稱 與 Property的名稱 Mapping的關係,讓JSON欄位名稱與Property名稱不一樣,也可Mapping。 DataContract 諸多功能,不一一贅述了。
[DataContract]
public partial class Product
{
    [DataMember(IsRequired=true, Name="ProductId")]
    public int ProductId { get; set; }    
    public string ProductName { get; set; }
    [DataMember]
    public Nullable<decimal> Price { get; set; }
    [DataMember]
    public Nullable<bool> Active { get; set; }
    [DataMember]
    public Nullable<decimal> Stock { get; set; }
}
static void Main(string[] args)
{    
    var url = new Uri("http://localhost:5109/Api/Products/1558");
    var client = new WebClient();
    var json = client.OpenRead(url);
    var serializer = new DataContractJsonSerializer(typeof(Product));
    var data = serializer.ReadObject(json) as Product;
    Console.WriteLine(data.ProductName);    
}

 

 

 

一天一分享,身體好健康。

該追究的不是過去的原因,而是現在的目的。