如何从Web服务JSON数组或对象反序列化?

时间:2010-12-14 12:13:40

标签: .net silverlight-4.0 c#-4.0 windows-phone-7

我在Windows Phone 7中创建了一个Web服务应用程序。这是从下面的uri获取的JSON数组。 ... [{ “ID”:4 “名称”: “班加罗尔”},{ “ID”:1, “名称”: “奈”},{ “ID”:3 “名称”: “海得拉巴” },{ “ID”:2 “名称”: “孟买”}] ...

列表项=(列表)ds.ReadObject(msnew); 在这一行中有一个错误(它在运行时说)。 alt text 反序列化type对象时出错。根级别的数据无效。第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 个答案:

答案 0 :(得分:9)

你要做的事情有两个错误。

  1. 您使用DataContractSerializer代替DataContractJsonSerializer。您尝试使用的是期望XML,而不是JSON。

  2. 您正在尝试反序列化为单个Item,然后将其转换为List<Item>,而不是数组,这是json包含的内容。

  3. 请改为尝试:

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

    如果您以后想要,可以将数组转换为列表。

答案 1 :(得分:1)

您可以从Silverlight SDK添加System.Json库。
它不是为WP7编译的,但对我来说它工作正常。