2013年6月20日 星期四

DataContractJsonSerializer 轉換 IDictionary 介面

轉換IDictionary介面的方式也一樣,只要注意初始化DataContractJsonSerializer類別時傳入IDictionary介面就好
但是輸出的結果並不如預期中為物件的格式
直接宣告一個Dictionary來當範例
// 淮備序列化的類別資料
Dictionary<int, object> dataList = new Dictionary<int, object>()
{
    {1, "a"},
    {2, "b"},
    {3, "c"}
};

初始化時要傳入這個Dictionary的型別
// 初始化DataContractJsonSerializer類別
DataContractJsonSerializer dcjs = new DataContractJsonSerializer(typeof(Dictionary<int, object>));
string jsonString = string.Empty;

序列化的方式一樣
// 序列化資料
using (MemoryStream ms = new MemoryStream())
{
    dcjs.WriteObject(ms, dataList);
    jsonString = Encoding.UTF8.GetString(ms.ToArray());
    Console.WriteLine(jsonString);
    Console.WriteLine();
}

反序列化的方式也一樣
// 反序列化資料
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))
{
    Dictionary<int, object> data2List = dcjs.ReadObject(ms) as Dictionary<int, object>;
    foreach (KeyValuePair<int, object> item in data2List)
    {
        Console.WriteLine(
            "Key:{0}, Value:{1}",
            item.Key,
            item.Value);
    }
}

執行結果可以看到序列化成JSON字串時,會固定變成Key:xx, Value:oo的陣列
這在不同JSON元件之間的轉換會造成一些問題