2012-01-02 197 views
1
{ 
    "response":{ 
     "code":200, 
     "message":"OK", 
     "data":[ 
     { 
      "user":{ 
       "id":"564564", 
       "firstName":"XYZ", 
       "lastName":"J.", 
       "photo":"https:\/\/img-s.example.com\/userpix_thumbs\/48935_12545435354.png", 
       "gender":"male", 
       "homeCity":"Algonquin, IL", 
       "contact":{ 

       } 
      }, 
      "lastCheckin":34634543532 
     }, 
     { 
      "user":{ 
       "id":"3254353", 
       "firstName":"PQR", 
       "lastName":"Black", 
       "photo":"https:\/\/img-s.example.com\/userpix_thumbs\/TJZE1FSTWBE5JA11.jpg", 
       "gender":"male", 
       "homeCity":"Chicago, IL", 
       "relationship":"friend", 
       "contact":{ 

       } 
      }, 
      "lastCheckin":3534523422345 
     } 
     ] 
    } 
} 

以上是JSON中的响应。我无法解析上述响应中的“用户”内容。它始终返回0而不是firstNamelastName字段。请帮忙。以下是我的代码。JSON中的解析响应

FSQAPIRec_CheckIn_Results g1 = new FSQAPIRec_CheckIn_Results(); 

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); 

HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); 

StreamReader sr = new StreamReader(resp.GetResponseStream()); 
string json = sr.ReadToEnd(); 
sr.Close(); 

g1 = JSONHelper.Deserialise<FSQAPIRec_CheckIn_Results>(json); 

if (g1.response.message == "OK") 
{ 

    List<FSQCheckIn_Data> obj = g1.response.data; 

    for (int i = 0; i < obj.Count(); i++) 
     { 
      List<FSQCheckIn_UserData> obj1 = obj[i].user; 
      for (int j = 0; j < obj1.Count(); j++) 
       lbl_Resent_Chechin.Text += (j + 1) + ") " + obj1[j].firstName + " " + obj1[j].lastName + "<br/><br/>"; 
     } 
} 


public class JSONHelper 
{ 
    public static T Deserialise<T>(string json) 
    { 
     using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json))) 
     { 
      var serialiser = new DataContractJsonSerializer(typeof(T)); 
      return (T)serialiser.ReadObject(ms); 
     } 
    } 

    public static string Serialize<T>(T obj) 
    { 
     DataContractJsonSerializer serializer = new  DataContractJsonSerializer(obj.GetType()); 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      serializer.WriteObject(ms, obj); 
      return Encoding.Default.GetString(ms.ToArray()); 
     } 
    } 



[Serializable] 
[DataContract] 
public class FSQAPIRec_CheckIn_Results 
{ 
    [DataMember] 
    public RecCheckIn_Response response { get; set; } 
} 
[Serializable] 
[DataContract] 
public class RecCheckIn_Response 
{ 
    [DataMember] 
    public string code { get; set; } 
    [DataMember] 
    public string message { get; set; } 
    [DataMember] 
    public List<FSQCheckIn_Data> data { get; set; } 
} 
[Serializable] 
[DataContract] 
public class FSQCheckIn_Data 
{ 
    [DataMember] 
    public List<FSQCheckIn_UserData> user { get; set; } 
} 
[Serializable] 
[DataContract] 
public class FSQCheckIn_UserData 
{ 
    [DataMember] 
    public string firstName { get; set; } 
    [DataMember] 
    public string lastName { get; set; } 
    [DataMember] 
    public string photo { get; set; } 
} 
+2

这可能是不相关的,但它不是很大,你在这里使用三种不同的编码 - 尤其是UTF-8(构建一个StreamReader时默认),Encoding.Unicode(在反序列化)和Encoding.Default(在Serialize中)。 – 2012-01-02 13:08:17

+0

你已经试过了什么?你在调试器中运行吗? – 2012-01-02 13:09:10

+0

它是否返回0或0个元素。 – Hammerstein 2012-01-02 13:11:12

回答

1

user项目不是一个列表,它是一个单一的对象。

... 
if (g1.response.message == "OK") { 
    List<FSQCheckIn_Data> obj = g1.response.data; 
    for (int i = 0; i < obj.Count(); i++) { 
    FSQCheckIn_UserData obj1 = obj[i].user; 
    lbl_Resent_Chechin.Text += "1) " + obj1.firstName + " " + obj1.lastName + "<br/><br/>"; 
    } 
} 
... 
+0

是的,先生,我已经将它更改为List obj1,但仍然给我的计数为0. – Rupesh 2012-01-02 13:20:15

+0

@Rupesh Guffa指出的是每个FSQCheckIn_Data都有一个用户,您需要将其更改为公共FSQCheckIn_UserData用户,它将起作用。或者改变json返回和用户数组。 – Hammerstein 2012-01-02 13:22:21

+0

@Hammerstein多谢先生,它像奇迹一样工作。 – Rupesh 2012-01-02 13:54:48