Как извлечь информацию из объекта, созданного JavaScriptSerializer - PullRequest
3 голосов
/ 21 июня 2010

Я разрабатываю приложение на C #, которое может управлять SqueezeboxServer (SBS).Связь с SBS осуществляется через JSON-сообщения на http://serverIP:9000/jsonrpc.js. Поэтому я отправляю JSON-сообщения через HTTPWepRequest и получаю ответы через HTTPWebResponse.

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

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

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

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

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

альтернативный текст http://www.freeimagehosting.net/uploads/865397a19e.jpg

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

альтернативный текст http://www.freeimagehosting.net/uploads/f6feb27ab5.jpg

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

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

Спасибо!

1 Ответ

0 голосов
/ 29 сентября 2011

Вы можете использовать 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 - как изменить имена полей

...