Как десериализовать из веб-службы JSON массив или объект? - PullRequest
3 голосов
/ 14 декабря 2010

Я создал одно приложение веб-службы в Windows Phone 7. Это массив JSON, полученный из нижеприведенного URI. ... [{ "ID": 4, "имя": "Бангалор"}, { "ID": 1, "имя": "Chennai"}, { "ID": 3, "имя": "Хайдарабад" }, { "ID": 2, "имя": "Mumbai"}] ...

Элемент списка = (Список) ds.ReadObject (msnew); В этой строке один баг (это говорит пока бега). alt text Произошла ошибка десериализации объекта типа. Данные на корневом уровне недействительны. Строка 1, позиция 1.

кодирование:

public MainPage () { InitializeComponent (); }

    [DataContract]
    public class Item
    {           

        [DataMember]
        public int id
        {
            get;
            set;
        }

        [DataMember]
        public string name
        {
            get;
            set;
        }
    }
    private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
    {
        WebClient wc = new WebClient();
        wc.DownloadStringAsync(new Uri("http://75.101.161.83:8080/CityGuide/Cities?authId=CITY4@$pir*$y$t*m$13GUID*5"));
        wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);
    }

    void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
       string MyJsonString = e.Result;
      // MessageBox.Show(e.Result);
       DataContractSerializer ds = new DataContractSerializer(typeof(Item));
       MemoryStream msnew = new MemoryStream(Encoding.UTF8.GetBytes(MyJsonString));
       List<Item> item = (List<Item>)ds.ReadObject(msnew);
    }

Ответы [ 2 ]

9 голосов
/ 14 декабря 2010

В том, что вы пытаетесь сделать, есть 2 ошибки.

  1. Вы используете DataContractSerializer вместо DataContractJsonSerializer. Тот, который вы пытаетесь использовать, ожидает XML, а не JSON.

  2. Вы пытаетесь десериализовать в один Item, а затем преобразовать его в List<Item>, а не в массив, который и есть в json.

Попробуйте вместо этого:

  var ds = new DataContractJsonSerializer(typeof(Item[]));
  var msnew = new MemoryStream(Encoding.UTF8.GetBytes(MyJsonString));
  Item[] items = (Item[])ds.ReadObject(msnew);

Если позже вы захотите, вы можете преобразовать массив в список.

1 голос
/ 14 декабря 2010

Вы можете добавить библиотеку System.Json из Silverlight SDK.
Он не скомпилирован для WP7, но для меня он работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...