CODE-Javascript Hashtable轉Dictionary
| | | 0 | |
這是寫給同事參考的範例: 如何在ASP.NET伺服器端承接Javascript以{“p1”:”v1”, "-123":"v2”}方式傳入的Hashtable? 由於鍵值可能出現負號等.NET不允許的屬性名稱字元,加上有哪些鍵值是動態決定,無法事先掌握,故不適合將其轉型成.NET中的類別,轉成Dictionary<string, string>應是較好的解決方法。
引用JSON.NET(PS: JSON.NET現在也可以使用NuGet安裝囉! 按個【讚】)與JavaScriptSerializer,只需幾行Code可以完成轉換。但若用DataContractJsonSerializer,Dictionary<>必須要轉成[{"Key":"...", "Value":"..."}, {"Key":"...", "Value":"..."}]的JSON格式才能順利轉換,在本範例中不推薦使用。
<%@ Page Language="C#" %> <%@ Import Namespace="Newtonsoft.Json" %> <%@ Import Namespace="Newtonsoft.Json.Linq" %> <%@ Import Namespace="System.Web.Script.Serialization" %> <%@ Import Namespace="System.Runtime.Serialization.Json" %> <%@ Import Namespace="System.IO" %> <script runat="server">
void Page_Load(object sender, EventArgs e)
{ if (Request["m"] == "parse")
{ //Javascript傳來的JSON字串 string jsonString = Request["dict"];
//方法1 用JSON.NET JObject JObject jo = JObject.Parse(jsonString);
Dictionary<string, string> dict =
jo.Properties().ToDictionary(
p => p.Name,
p => (string)p.Value );
DumpDictionary("JSON.NET 1", dict); //方法2 用JSON.NET直接轉Dictionary<string, string> dict =
JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonString);
DumpDictionary("JSON.NET 2", dict); //方法3 使用JavaScriptSerializer.Deserialize JavaScriptSerializer jss = new JavaScriptSerializer(); dict = (Dictionary<string, string>)
jss.Deserialize(jsonString, typeof (Dictionary<string, string>));
DumpDictionary("JavaScriptSerializer", dict); //DataContractJsonSerializer所要求的Dictionary<string, string>格式是 //[{"Key":"P1", "Value":"很麻煩"}, {"Key":"123", "Value":"不好用"}] //無法直接解讀前方傳來的Hashtable JSON字串,所以... //決定放過它(也饒了自己),只做個簡單驗證 jsonString =
@"[{""Key"":""P1"", ""Value"":""很麻煩""}, {""Key"":""123"", ""Value"":""不好用""}]";
DataContractJsonSerializer dcs =
new DataContractJsonSerializer(typeof(Dictionary<string, string>));
MemoryStream ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(jsonString)); dict = dcs.ReadObject(ms) as Dictionary<string, string>;
DumpDictionary("DataContractJsonSerializer", dict); Response.End();
}
}
void DumpDictionary(string title, Dictionary<string, string> dict)
{ Response.Write(title +
"\r\n===============================\r\n"); Response.Write(
string.Join("\r\n",
dict.Select(
kv =>
string.Format("{0}=>{1}", kv.Key, kv.Value)
).ToArray()));
Response.Write("\r\n\r\n"); }
</script>
<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title>
<script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script>
<script type="text/javascript"> $(function () { var hash = {}; //故意使用C#中不可做為Property名稱的字樣 hash["P1"] = "V0";
hash["123"] = "V1";
hash["1-2"] = "V2";
hash["中文"] = "V3";
$.post("HashtableJson.aspx", { m: "parse", dict: JSON.stringify(hash) }, function (r) { alert(r);
});
});
</script>
</head>
<body>
</body>
</html>
執行結果:
JSON.NET 1
===============================
123=>V1
P1=>V0
1-2=>V2
中文=>V3
JSON.NET 2
===============================
123=>V1
P1=>V0
1-2=>V2
中文=>V3
JavaScriptSerializer
===============================
123=>V1
P1=>V0
1-2=>V2
中文=>V3
DataContractJsonSerializer
===============================
P1=>很麻煩
123=>不好用
Comments
Be the first to post a comment