2011-05-15 5 views
2
json ="{ 
    "data": [ 
     { 
     "id": "1000", 
     "from": { 
      "name": "Anthony Waema", 
      "category": "message", 
      "id": "192" 
     }, 
     "message": "this is the message", 
     "updated_time": "2001-05-06T19:34:15+0000", 
     "likes": { 
      "data": [ 
       { 
        "id": "100001692250255", 
        "name": "\u00dcnal Turanl\u0131" 
       }, 
       { 
        "id": "100001060078996", 
        "name": "S\u00e9f\u00e2 K\u00e2ql\u00e4Nn" 
       }] 
       }, 
     { 
     "id": "10150186255753553", 
     "from": { 
      "name": "another name", 
      "category": "message", 
      "id": "100001" 
     }, 
     "message": "this is the message", 
     "updated_time": "2001-04-06T19:34:15+0000", 
     "likes": { 
      "data": [ 
       { 
        "id": "1002345", 
        "name": "\u00dcnal Turanl\u0131" 
       }, 
       { 
        "id": "100234", 
        "name": "S\u00e9f\u00e2 K\u00e2ql\u00e4Nn" 
       }] 
       } 
     } 
] 
}"; 

public class Allstatus 
    { 
     public List<sdata> data { get; set; } 
     public scpaging paging { get; set; } 
    } 

public class sdata 
    { 

     public string id { get; set; } 
     public sfrom from { get; set; } 
     public string message { get; set; } 
     public string updated_time {get; set;} 
     public List<likesdata> likes { get; set; } 
    } 
    public class likesdata 
    { 
     public string id{ get; set; } 
     public string name{ get; set; } 
    } 
public class sfrom 
{ 
     public string name {get; set;} 
     public string category {get; set;} 
     public string id {get; set;} 
} 

       JavaScriptSerializer ser = new JavaScriptSerializer(); 
       page = ser.Deserialize<allstatus>(json); 
       foreach (sdata cd in page.data) 
       { 
        foreach(likesdata ld in cd.likes.data) 
        { 
         Console.WriteLine(ld.id+"\t"+ld.name); 
        } 

       } 

문제를 json.net 사용하여 구문 분석 : 는 내가 JSON을 구문 분석하고 좋아하는 데이터를 검색 할 필요가있다. "from"데이터에 액세스 할 수 있지만 "likes"데이터에는 액세스 할 수 없습니다. 이렇게하면 null 참조 오류가 발생합니다. 여기에 도움이 필요해 .. 고마워.JSON은 system.web.script.seriarilization를 사용하거나

답변

3

Edit2가 :https://gist.github.com/973510, 반환 된 JSON로부터 명확한를 참조

그 특정 페이스 북의 메시지는 likes라는 속성이 포함 나던 어떤 좋아, 다음 반환 된 JSON이 나던합니다. 따라서 의 likes 속성은 null입니다. 서버가 데이터를 반환하는 방법입니다.

이 문제를 처리 할 수있는 방법에는 두 가지가 있습니다. likes이 null인지 여부를 수동으로 확인하십시오. 또는 sdata 생성자에서 likes 속성을 초기화합니다. likesdatacollection 생성자에서 likesdata 목록을 초기화합니다.

코드 : FB 어떤 좋아하는 반환 나던 경우에도

public class sdata 
{ 
    // other properties 

    public likedatacollection likes { get; set; } 

    public sdata() 
    { 
     likes = new likedatacollection(); 
    } 
} 

public class likedatacollection 
{ 
    public List<likesdata> data { get; set; } 

    public likedatacollection() 
    { 
     data = new List<likesdata>(); 
    } 
} 

이 방법, 생성자는 속성을 초기화합니다, 그래서 그들은 null이되지 않습니다. 그런 다음 likes.data.Count > 0을 확인할 수 있습니다. 그렇다면 fb가 좋아하는 것을 반환하고, 그렇지 않으면 fb가 좋아하는 것을 반환하지 않습니다.

EDIT1 : 영업의 코멘트, json으로 제대로 형성되고, 그 명확한에서

. 의미, json은 일부 서버 API에서 검색됩니다. 따라서 범인은 sdata 클래스입니다. 전체 솔루션은 this gist을 참조하십시오.

짧은 버전. 가장 간단한 경우, C# 클래스는 json과 완전히 동일한 구조를 따라야합니다. json에 따라 data에는 likes이라는 속성이 있습니다. likes 개체는 속성 ID와 이름을 가진 개체의 배열 인 data이라는 속성이 있습니다.

그래서 C# 클래스 sdata에는 유형의 likes이라는 속성이 있어야합니다. 이 클래스는 List<likesdata>data 유형이어야합니다 ...

사람들은 일반적으로 Json.Net을 선호하는 것 같습니다. 그래서 그것을 사용하고 싶을 것입니다. 내가 사용하는 이유는 .Net 2.0 코드베이스에서 작동해야하기 때문이다 ...

+0

.NET 2.0 외에도 내장 JavaScriptSerializer 대신 외부 라이브러리를 사용하는 것이 좋은 이유가 있습니까? 필자는 절대적으로 필요한 경우가 아니라면 응용 프로그램에서 외부 종속성을 사용하는 것을 좋아합니다. –

+0

그건 그렇고, 좋은 대답. +1 –

+0

@Kevin, JavaScriptSerializer는 System.Web 안에 있으므로 .NET 3.5 이상에서는 클라이언트 프로파일을 사용할 수 없습니다. –

1

JSON Lint과 같은 유효성 검사기를 통해 JSON을 실행해야한다. 그러면 JSON 오류를 찾을 수 있습니다.

+0

감사합니다. 내 문자열을 실행하고 그들은 괜찮아. –