Tulisan ini merupakan kelanjutan dari post sebelumnya tentang Json Serializer dan Deserializer. Pada tulisan sebelumnya, string JSON dideserialize ke dalam Generic Dictionary. Kekurangan dari metode tersebut adalah kita tidak bisa menggunakan strong-type object untuk deserialize JSON. Metode tersebut juga sudah dianggap usang oleh .NET Framework 3.5 karena dalam framework tersebut sudah disediakan pengganti System.Web.Script.Serialization.JavaScriptSerializer yaitu System.Runtime.Serialization.Json.DataContractJsonSerializer.
Untuk dapat menggunakan System.Runtime.Serialization.Json.DataContractJsonSerializer perlu menambahkan dua assembly reference ke dalam project yaitu: System.Runtime.Serialization (butuh .NET Framework 3.0) dan System.ServiceModel.Web (butuh .NET Framework 3.5). Setelah kedua assembly ini direferensikan, beberapa hal yang perlu disiapkan diantaranya.
1. Tambahkan kedua namespace berikut
using System.Runtime.Serialization.Json;
using System.Runtime.Serialization;
2. Buat class yang digunakan untuk men-deserialize JSON string.
Dalam contoh ini dibuat class berdasarkan JSON yang sama seperti tulisan sebelumnya (Json Serializer dan Deserializer). Struktur string JSON tersebut adalah:
var dateFormat = '<%= GlobalCallCenter.Common.CallCenterConfig.Get("SHORT_DATE_FORMAT") %>';
var filter = {
instance: $get('<%= instanceList.ClientID %>').value,
requestNo: $get('<%= requestNoTextBox.ClientID %>').value,
category: $get('<%= categoryList.ClientID %>').value,
itemCategory: $get('<%= itemAffectedList.ClientID %>').value,
ticketGroup: $get('<%= ticketGroupList.ClientID %>').value,
status: $get('<%= statusList.ClientID %>').value,
requestType: $get('<%= typeList.ClientID %>').value,
startDate: Date.parseLocale($get('<%= dateFromTextBox.ClientID %>').value, dateFormat),
finishDate: Date.parseLocale($get('<%= dateToTextBox.ClientID %>').value, dateFormat),
requestedFor: $get('requestedForEmployeeId').value,
assigneeId: ($get('<%= assigneeForEmployeeId.ClientID %>') != null) ? $get('<%= assigneeForEmployeeId.ClientID %>').value : $get('<%= assigneeForEmployeeIdLabel.ClientID %>').innerHTML
};
Dari JSON tersebut di atas, dibuat class sebagai berikut:
[DataContract(Name = "Filter", Namespace = "")]
protected internal class Filter {
[DataMember(Name = "instance", Order = 1)]
public string Instance { get; set; }
[DataMember(Name = "requestNo", Order = 2)]
public string RequestNo { get; set; }
[DataMember(Name = "category", Order = 3)]
public string Category { get; set; }
[DataMember(Name = "itemCategory", Order = 4)]
public string ItemCategory { get; set; }
[DataMember(Name = "ticketGroup", Order = 5)]
public string TicketGroup { get; set; }
[DataMember(Name = "status", Order = 6)]
public string Status { get; set; }
[DataMember(Name = "requestType", Order = 7)]
public string RequestType { get; set; }
[DataMember(Name = "startDate", Order = 9)]
public DateTime StartDate { get; set; }
[DataMember(Name = "finishDate", Order = 10)]
public DateTime FinishDate { get; set; }
[DataMember(Name = "requestedFor", Order = 10)]
public string RequestedFor { get; set; }
[DataMember(Name = "assigneeId", Order = 10)]
public string AssigneeId { get; set; }
}
3. Buat implementasi deserialization.
Seperti pada tulisan sebelumnya di Json Serializer dan Deserializer, saya gunakan contoh yang sama yaitu event callback pada Janus Grid sebagai berikut.
protected void GridEX1_CustomCallBack(object sender, Janus.Web.Common.CustomCallBackEventArgs e)
{
var edata = System.Web.HttpUtility.UrlDecode(e.EventData.ToString());
System.IO.MemoryStream stream = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(edata.ToString()));
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Filter));
Filter filter = (Filter)serializer.ReadObject(stream);
}
Dengan menggunakan strong-type kita langsung dapat mengakses property dari class tersebut, seperti terlihat pada gambar berikut.
Berbeda dari tulisan sebelumnya, dengan menggunakan strong-type object, semua property dapat diakses sesuai dengan tipe yang sudah didefinisikan.
Semoga bermanfaat.