簡體   English   中英

如何從 JavaScriptSerializer 生成的對象中提取信息

[英]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 ); 

JavaScriptSerializer.Deserialize - 如何更改字段名稱

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM