Ошибка разбора JSON в Windows Phone 7 - PullRequest
1 голос
/ 11 мая 2011

У меня есть эта строка JSON

{ "rs:data": { "z:row": [ {"Lead": "", "Industry": "Other Commercial", "ID": "908", "Name": "3PAR Ltd." }, {"Lead": "Ebeling, Kevin R.", "Industry": "Retail", "ID": "1", "Name": "7-Eleven" } ] }}

Теперь я получаю данные в вышеуказанном формате из веб-службы в Win phone 7. Но при попытке анализа я сталкиваюсь с ошибкой:

    void fetcher_GetClientsCompleted(object sender, ServiceReference2.GetClientsCompletedEventArgs e)
    {
        StringReader reader;
        reader = new StringReader(e.Result);
        IList<Clientclass> cc;
        string MyJsonString = reader.ReadToEnd(); //

        cc = Deserialize(MyJsonString); 
    }


    public static IList<Clientclass> Deserialize(string json)
    {
        using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
        {
            var serializer = new DataContractJsonSerializer(typeof(IList<Clientclass>));
            return (IList<Clientclass>)serializer.ReadObject(ms);
        }
    }

Мои данные должны быть проанализированы в соответствии с клиентским классом, где клиентский класс:

    public class Clientclass
    {
        string _id;
        string _name;
        string _industry;
        string _lead;

        public string ID
        {
            get { return _id; }
            set { _id = value; }
        }
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        public string Industry
        {
            get {return _industry; }
            set { _industry= value; }
        }
        public string Lead
        {
            get { return _lead; }
            set { _lead = value; }
        }
    }

Обратите внимание, что в строке JSON содержится более одной записи.

Спасибо santu

1 Ответ

1 голос
/ 11 мая 2011

Вы десериализуете неправильный тип (IList вместо List of ClientClass - исходное сообщение имело typeof (IList) , однако Крис исправил это как часть своих изменений форматирования кода). Вы должны делать:

public static List<Clientclass> Deserialize(string json)
{
    using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
    {
        var serializer = new DataContractJsonSerializer(typeof(List<Clientclass>));
        return (List<Clientclass>)serializer.ReadObject(ms);
    }
}

Кроме того, ваш JSON включает в себя то, что вы не декодируете. Если вы хотите использовать вышеуказанный метод, ваш JSON должен быть:

[ {"Lead": "", "Industry": "Other Commercial", "ID": "908", "Name": "3PAR Ltd." }, {"Lead": "Ebeling, Kevin R.", "Industry": "Retail", "ID": "1", "Name": "7-Eleven" } ]

Чтобы декодировать строку из исходного сообщения, вам понадобится содержащий класс и определить атрибуты DataMember для обработки имен:

    public class ClassA
    {
        [DataMember(Name = "rs:data")]
        public ClassB Data { get; set; }
    }

    public class ClassB
    {
        [DataMember(Name="z:row")]
        public List<Clientclass> Row { get; set; }
    }

Затем десериализовать ClassA:

    public static ClassA Deserialize(string json)
    {
        using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
        {
            var serializer = new DataContractJsonSerializer(typeof(ClassA));
            return (ClassA)serializer.ReadObject(ms);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...