2011-05-15 92 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並檢索喜歡的數據。 我可以訪問「from」數據但不能「喜歡」數據..當我這樣做時,我得到nullreference錯誤。幫助需要在這裏..謝謝。使用system.web.script.seriarilization解析Json或使用json.net

回答

3

EDIT2:

參考https://gist.github.com/973510,從返回JSON其明確的是,如果一個特定的Facebook消息,可是沒有任何喜歡,那麼返回的JSON犯規含有一種叫likes屬性。因此sdata objectlikes財產爲空。那就是服務器如何返回數據。

有兩種方法可以解決這個問題。要麼手動檢查likes是否爲空。或者在sdata構造函數中初始化likes屬性。並在likesdatacollection構造函數中初始化likesdata列表。

代碼:

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>(); 
    } 
} 

這樣一來,即使FB犯規返回任何喜歡,構造函數將初始化屬性,所以他們不會爲空。然後你可以檢查likes.data.Count > 0。如果是,那麼fb返回喜歡,否則fb不會返回喜歡。

EDIT1:

從OP的評論,其明確指出,JSON格式正確。意思是,json是從某個服務器api中檢索的。因此它是sdata類是罪魁禍首。請查看this gist以獲取完整的解決方案。

簡短版本。對於最簡單的情況,您的c#類需要遵循與您的json完全相同的結構。根據json,data有一個名爲likes的屬性。 likes對象有一個名爲data的屬性,它是具有屬性id和名稱的對象數組。

所以你的c#類sdata應該有一個類型likesdatacollection類型的屬性。這個類應該有一個屬性data類型List<likesdata> ...

題外話,人們通常似乎更喜歡Json.Net ...所以你可能想要使用它。我使用它的原因是因爲我需要它在.Net 2.0代碼庫中工作...

+0

除了使用.NET 2.0,是否真的有一個很好的理由使用外部庫而不是內置JavaScriptSerializer?除非絕對必要,否則我不會在應用程序中使用外部依賴關係。 – 2011-05-15 17:33:28

+0

順便說一句,很好的答案。 +1 – 2011-05-15 17:33:48

+0

@Kevin,JavaScriptSerializer位於System.Web內部,因此您將無法使用.NET 3.5及更高版本的客戶端配置文件。 – 2011-05-15 17:44:22

1

您應該嘗試通過像JSON Lint這樣的驗證程序來運行您的JSON。這應該會幫助您找到任何JSON錯誤。

+0

謝謝我跑我的弦和他們沒事。 – 2011-05-15 18:31:28