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);
}
一天一分享,身體好健康。
該追究的不是過去的原因,而是現在的目的。