Парсинговый комплекс JSON - PullRequest
1 голос
/ 17 ноября 2011

Я хочу разобрать сложный JSON на WP7.Сначала я должен проанализировать канал JSON и получить данные для анализа второго канала JSON.

Для анализа первого канала я использую этот веб-сервис http://horaires -ter-sncf.naholyr.fr / prochainsdeparts.php? gare = ... после этого мы используем код и название станции для анализа второго канала http://horaires -ter-sncf.naholyr.fr / prochainsdeparts.php? gare = .... & id = ...

Это мой код, но он не работает:

public static class Parser
        {
            public static string resultats;
            public static reponse[] obj = new reponse[]{new reponse(),new reponse()};
            public static reponse1 obj1 = new reponse1();


            public static void HttpsCompleted_reponse(object sender, DownloadStringCompletedEventArgs e)
            {
                Horaire hre =new Horaire();
                  try
                {
                    var ms = new MemoryStream(Encoding.Unicode.GetBytes(resultats));
                    var ser = new DataContractJsonSerializer(typeof(reponse1));
                    obj1 = (reponse1)ser.ReadObject(ms);

                }

                catch
                {

                    WebClient wc = new WebClient();
                    //wc.DownloadStringCompleted += HttpsCompleted_reponse1;
                    wc.DownloadStringAsync(new Uri("http://horaires-ter-sncf.naholyr.fr/prochainsdeparts.php?gare=" +hre.gettxt()));
                    Debug.WriteLine("youuuuuuuuuuuuuuuuuuuuuuuppppppppppiiii");
                }

            }
            /*
            public static void HttpsCompleted_reponse1(object sender, DownloadStringCompletedEventArgs e)
            {
                try
                {
                    var ms = new MemoryStream(Encoding.Unicode.GetBytes(resultats));
                    var ser = new DataContractJsonSerializer(typeof(Gare));
                    obj1 = (reponse1)ser.ReadObject(ms);

                }

                catch
                {

                    WebClient wc = new WebClient();
                        wc.DownloadStringCompleted += HttpsCompleted_reponse;
                        wc.DownloadStringAsync(new Uri("http://horaires-ter-sncf.naholyr.fr/prochainsdeparts.php?gare=" + obj.success.Gares.Eleme + "&id=" + obj.success.id));

                }

            }

        */

        }
        public class Depart
        {
            [DataMember(Name = "type")]
            public string type { get; set; }
            [DataMember(Name = "heure")]
            public string heure { get; set; }
            [DataMember(Name = "destination")]
            public string destination { get; set; }
            [DataMember(Name="attention")]
            public string attention { get; set; }
            [DataMember(Name = "retards")]
            public string [] retards { get; set; }
            [DataMember(Name = "source")]
            public string source { get; set; }
            public Depart()
            {
            }
        }

        public class Success {
            [DataMember(Name = "nom")]
            public string nom { get; set; }
            [DataMember(Name = "id")]
            public int id { get; set; }
            [DataMember(Name = "departs")]
            public Depart[] departs { get; set; }
                    public Success() 
                    {
                        this.departs = new Depart[0];
                    }
             }
        public class Success1
        {
            [DataMember(Name="Gares")]
            public Gare[] Gares { get; set; }
                public Success1()
                {
                    this.Gares = new Gare[0];
                }
        }
        public class Gare{


            [DataMember(Name="Nom")]
            public string Nom { get; set; }
            [DataMember(Name="code")]
            public int code { get; set; }
                public Gare() 
                {
                }
        }

        public class reponse
        {

            [DataMember(Name = "code")]
            public string code{get;set;}
            [DataMember(Name = "success")]
            public Success1 success{get;set;}
                public reponse()
                {
                    this.success = new Success1();
                }
             }
        public class reponse1 {
            [DataMember(Name = "code")]
            public string code { get; set; }
            [DataMember(Name = "success")]
            public Success success { get; set; }
                public reponse1() 
                {
                    this.success = new Success();
                }
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            //for (int i=0; i<=Parser.obj1.Length;i++)
            Debug.WriteLine(Parser.obj1.success.nom);
        }
    }

Ответы [ 2 ]

4 голосов
/ 18 ноября 2011

В вашем коде есть несколько проблем. Но даже если вы решите их, вы не сможете проанализировать список принятых станций с DataContractJsonSerializer из коробки.

Пояснение:

Веб-сайт, предлагающий веб-службу, которую вы используете , говорит, что ответ от вашего первого "потока JSON" выглядит следующим образом:

{ "код": 201, "успех": { "Gares": { "Вильфранш-d''alb.-Ce": 1750, "вильфранш de rgue-12 ": 1749, ...}}}

Посмотрите на станции и их идентификаторы:

{"villefranche-d''alb.-ce»: 1750, «villefranche de rgue-12»: 1749, ...}

Это ассоциативный массив, в котором ключи и значения явно не обозначены как «Ключ» и «Значение». Но эти декорации необходимы для DataContractJsonSerializer для анализа JSON. Они должны быть в формате

[{ «Key»: «вильфранш-d''alb.-се», «Значение»: «1750»}, { «Key»: «вильфранш de rgue-12 »,« Значение »:« 1749 »}]

для правильного анализа DataContractJsonSerializer. (Причина в том, что этот сериализатор поддерживает более сложные типы, чем int и string для использования в качестве ключей и значений.)

Этот блог содержит очень хорошее описание вопроса и того, как JavaScriptSerializer может быть решением. Но, к сожалению, этот класс недоступен в Silverlight.

Больше людей, подобных вам, таких же:

Решение:

Использование Json.NET .

1 голос
/ 17 ноября 2011

Взгляните на json.NET, он должен предоставить вам linq2json и простую сериализацию для объекта.

...