2010-06-21 4 views
3

Я разрабатываю приложение на C#, которое может управлять SqueezeboxServer (SBS). Общение с SBS осуществляется через сообщения JSON до http://serverIP:9000/jsonrpc.js Итак, я отправляю сообщения JSON через HTTPWepRequest и получаю ответы через HTTPWebResponse.Как извлечь информацию из объекта, созданного JavaScriptSerializer

Ответ, который я получаю, представляет собой строку в обозначении JSON. И вот тут проблемы начинаются ... На данный момент я конвертирую сообщение JSON в объект с JavaScriptSerializer. Это выглядит так:

public static Object FromJSON(this string reply) 
{ 
    JavaScriptSerializer deSerializer = new JavaScriptSerializer(); 
    return deSerializer.DeserializeObject(reply); 
} 

Этот код дает мне объект, в котором хранятся данные, которые я прошу. Данные, которые я прошу, могут быть разными. Иногда ответ - это один ответ, в то время как в других ситуациях это может быть несколько вещей.

Рассмотрим два изображения, я включил:

Первый показывает объект после того, как он был возвращен в десериализатор. Вы можете видеть, что объект представляет собой словарь с 4 парами ключ-значение. В kvp меня интересует, это четвертый. Ключевым «результатом» является тот, который содержит данные, которые мне нужны. Но этот ключ имеет еще один Диктонарь как ценность. И это продолжается и продолжается до фактических данных, которые я хочу, это название альбома и его идентификатор.

alt text http://www.freeimagehosting.net/uploads/865397a19e.jpg

На втором изображении данные я хочу это значение 0, которое принадлежит к ключу «_count». Как вы можете видеть, этот объект менее сложный.

alt text http://www.freeimagehosting.net/uploads/f6feb27ab5.jpg

Так Bottomline мой вопрос, как я могу сделать решение, которое может извлекать информацию, которую я хочу, но работает с differt вида объектов (как в разных глубинах)?

Надеюсь, что кто-нибудь может отправить меня в правильном направлении.

Спасибо!

ответ

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 - how to change field names

Смежные вопросы