2012-01-02 3 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입니다. 위의 응답에서 "사용자"콘텐츠를 구문 분석 할 수 없습니다. firstNamelastName 필드 대신 항상 0을 반환합니다. 도와주세요. 아래는 제 코드입니다.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의 (a 위해 StreamReader를 구성하는 기본), Encoding.Unicode (직렬화에) 및 Encoding.Default (직렬화)입니다. –

+0

무엇을 이미 시도 했습니까? 디버거에서 실행 했습니까? –

+0

0 또는 0 요소를 반환하고 있습니까? – Hammerstein

답변

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

예, 저는 그것을 obj1 목록으로 변경했지만 여전히 0이라는 계산을 받았습니다. – Rupesh

+0

@Rupesh Guffa가 지적한 바는 각 FSQCheckIn_Data에 단일 사용자가 있다는 것입니다 , 공용 FSQCheckIn_UserData 사용자로 변경해야합니다. 그러면 작동합니다. 또는 json을 리턴하고 사용자 배열로 변경하십시오. – Hammerstein

+0

@Hammerstein 고마워요. 선생님, 그것은 기적처럼 일했습니다. – Rupesh