2012-02-09 122 views
0

無法將json反序列化爲對象。嘗試使用DataContractJsonSerializer
這是我如何使用它
不知道如何應付呢..
CLASS如何將json反序列化爲c中的對象#

[Serializable] 
    public class user 
    { 
     public user() { } 
     public user(string _uid, string _first_name, string _last_name, string _online) 
     { 
      this._uid = _uid; 
      this._first_name = _first_name; 
      this._last_name = _last_name; 
      this._online = _online; 
     } 

     string _uid; 
     string _first_name; 
     string _last_name; 
     string _online; 

     [DataMember] 
     public string uid 
     { 
      get { return _uid; } 
      set { _uid = value; } 
     } 

     [DataMember] 
     public string first_name 
     { 
      get { return _first_name; } 
      set { _first_name = value; } 
     } 

     [DataMember] 
     public string last_name 
     { 
      get { return _last_name; } 
      set { _last_name = value; } 
     } 
     [DataMember] 
     public string online 
     { 
      get { return _online; } 
      set { _online = value; } 
     } 
    } 

DataContractJsonSerializer使用

 WebRequest w = WebRequest.Create(string.Format("https://api.vk.com/method/friends.get?uid=6631031&fields=uid,first_name,last_name&access_token={0}",_accesstoken)); 
     Stream stream = w.GetResponse().GetResponseStream(); 

     //StreamReader sread = new StreamReader(stream);//here i can get the result into a string 
     //string sLine = sread.ReadLine();    //to make sure the result is valid json 

     DataContractJsonSerializer json = new DataContractJsonSerializer(typeof(user[])); 
     var result = (user[]) json.ReadObject(stream); 

比如我的JSON

"{\"response\":[{\"uid\":779358,\"first_name\":\"Dark\",\"last_name\":\"Knight\",\"online\":0},{\"uid\":1023931,\"first_name\":\"Екатерина\",\"last_name\":\"Гаврилова\",\"online\":0},{\"uid\":2475856,\"first_name\":\"Даша\",\"last_name\":\"Матвеева\",\"online\":0},......]}" 
+0

重複的問題:http://stackoverflow.com/問題/ 3142495/deserialize-json-into-c-sharp-dynamic-object – 2012-02-09 22:16:29

回答

0

你可以定義包含爲了user[]類型的response屬性包裝對象,以反映您的JSON結構:

[DataContract] 
public class Result 
{ 
    [DataMember] 
    public user[] response { get; set; } 
} 

然後:

DataContractJsonSerializer json = new DataContractJsonSerializer(typeof(Result)); 
Result result = (Result)json.ReadObject(stream); 
user[] users = result.response; 
+0

現在就試試吧.. – user1200752 2012-02-09 22:16:26

+0

@Dimitrov,我試過了。在結果結果=(結果)json.ReadObject(stream);有一個異常SerializationException。數據協定類型「wpfapp3.mainwindow + user」無法反序列化,因爲找不到所有必需的數據元素「_first_name,_last_name,_online,_uid」。對於描述 – user1200752 2012-02-09 22:28:05

+0

@ user1200752的翻譯感到抱歉,這裏有幾件事要嘗試。將這個'user'類聲明移動到一個單獨的文件中,以便它不嵌套在MainWindow類中。然後用'[DataContract]'屬性裝飾它,並移除'[Serializable]'屬性。 – 2012-02-09 22:36:35