![](/img/trans.png)
[英]How to a Deserialize Json object made by JavaScriptSerializer from a List in jQuery/Javascript
[英]How to extract information from an Object produced by JavaScriptSerializer
我正在用 C# 開發一個可以控制 SqueezeboxServer(SBS) 的應用程序。 與 SBS 的通信是通過 JSON 消息發送到http://serverIP:9000/jsonrpc.js所以我通過 HTTPWepRequest 發送 JSON 消息並通過 HTTPWebResponse 獲得答案。
我得到的答案是一個 JSON 表示法的字符串。 這就是問題開始的地方……現在我使用 JavaScriptSerializer 將 JSON 消息轉換為對象。 這是這樣的:
public static Object FromJSON(this string reply)
{
JavaScriptSerializer deSerializer = new JavaScriptSerializer();
return deSerializer.DeserializeObject(reply);
}
這段代碼給了我一個保存我要求的數據的對象。 我要求的數據可能非常不同。 有時答案是一個單一的答案,而在其他情況下則可能是多個問題。
讓我們考慮一下我包含的兩個圖像:
第一個顯示對象被 deSerializer 返回后。 您可以看到該對象是一個包含 4 個鍵值對的 Dictionary。 我感興趣的 kvp 是第 4 個。 關鍵的“結果”是保存我需要的數據的結果。 但是這個鍵有另一個字典作為值。 這一直持續到我想要的實際數據,即專輯名稱及其 ID。
在第二張圖片中,我想要的數據是屬於“_count”鍵的值 0。 如您所見,此對象不那么復雜。
所以我的問題的底線是我如何制定一個解決方案,該解決方案可以檢索我想要的信息但適用於不同類型的對象(如不同深度)?
希望任何人都可以向我發送正確的方向。
謝謝!
您可以使用 JavaScriptConverter 來更好地控制反序列化體驗。
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Web.UI.WebControls;
using System.Collections;
namespace System.Web.Script.Serialization.CS {
public class ListItemCollectionConverter: JavaScriptConverter {
public override IEnumerable <Type> SupportedTypes {
//Define the ListItemCollection as a supported type.
get {
return new ReadOnlyCollection <Type> (new List <Type> (new Type[] {
typeof(ListItemCollection)
}));
}
}
public override IDictionary <string, object> Serialize(object obj, JavaScriptSerializer serializer) {
ListItemCollection listType = obj as ListItemCollection;
if (listType != null) {
// Create the representation.
Dictionary <string, object> result = new Dictionary <string, object> ();
ArrayList itemsList = new ArrayList();
foreach(ListItem item in listType) {
//Add each entry to the dictionary.
Dictionary <string, object> listDict = new Dictionary <string, object> ();
listDict.Add("Value", item.Value);
listDict.Add("Text", item.Text);
itemsList.Add(listDict);
}
result["List"] = itemsList;
return result;
}
return new Dictionary <string, object> ();
}
public override object Deserialize(IDictionary <string, object> dictionary, Type type, JavaScriptSerializer serializer) {
if (dictionary == null)
throw new ArgumentNullException("dictionary");
if (type == typeof(ListItemCollection)) {
// Create the instance to deserialize into.
ListItemCollection list = new ListItemCollection();
// Deserialize the ListItemCollection's items.
ArrayList itemsList = (ArrayList) dictionary["List"];
for (int i = 0; i < itemsList.Count; i++)
list.Add(serializer.ConvertToType <ListItem> (itemsList[i]));
return list;
}
return null;
}
}
}
然后反序列化
var serializer = new JavaScriptSerializer();
serialzer.RegisterConverters( new[]{ new DataObjectJavaScriptConverter() } );
var dataObj = serializer.Deserialize<DataObject>( json );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.