2012-09-06 97 views
1

我想了很多個小時來解析JsonArray,我有graph.facebook,所以我可以額外的價值。我想要提取的值是消息和ID。解析Json Facebook的c#

獲取JasonArry是沒有問題,正常工作:

[ 
    { 
    "code":200, 
    "headers":[{"name":"Access-Control-Allow-Origin","value":"*"}], 
    "body":"{ 
     \"id\":\"255572697884115_1\", 
     \"from\":{ 
      \"name\":\"xyzk\", 
      \"id\":\"59788447049\"}, 
     \"message\":\"This is the first message\", 
     \"created_time\":\"2011-11-04T21:32:50+0000\"}"}, 
    { 
    "code":200, 
    "headers":[{"name":"Access-Control-Allow-Origin","value":"*"}], 
    "body":"{ 
     \"id\":\"255572697884115_2\", 
     \"from\":{ 
      \"name\":\"xyzk\", 
      \"id\":\"59788447049\"}, 
     \"message\":\"This is the second message\", 
     \"created_time\":\"2012-01-03T21:05:59+0000\"}"} 
] 

現在,我已經嘗試了幾種方法來獲得訪問信息,但是每一個方法在捕撈結束...並拋出異常。

例如:

var serializer = new JavaScriptSerializer(); 
var result = serializer.Deserialize<dynamic>(json); 

foreach (var item in result) 
{ 
    Console.WriteLine(item.body.message); 
} 

拋出異常:System.Collections.Generic.Dictionary犯規包含體的定義。不過,您在下面的屏幕截圖中看到,該主體包含定義。

因爲...我不允許張貼圖片,你可以找到它的directupload:http://s7.directupload.net/images/120907/zh5xyy2k.png

我不還沒有更多的想法,所以我請你幫助我。我需要這個項目,私人,而不是商業。

也許你可以給我一個代碼的短語,所以我可以繼續我的發展。

謝謝到目前爲止

多米尼克

回答

3

你是不是反序列化到一個強類型的對象,這是正常的應用程序會拋出異常。換句話說,反序列化器不會爲你創建一個Anynymous類。

您的字符串實際上是反序列化爲2個對象,每個對象包含Dictionary<string,object>元素。所以,你需要做的是這樣的:

var serializer = new JavaScriptSerializer(); 
var result = serializer.Deserialize<dynamic>(s); 

foreach(var item in result) 
{ 
    Console.WriteLine(item["body"]["message"]); 
} 

下面是一個完整的示例代碼:

void Main() 
{ 
     string json = @"[ 
    { 
    ""code"":200, 
    ""headers"":[{""name"":""Access-Control-Allow-Origin"",""value"":""*""}], 
    ""body"":{ 
     ""id"":""255572697884115_1"", 
     ""from"":{ 
      ""name"":""xyzk"", 
      ""id"":""59788447049""}, 
     ""message"":""This is the first message"", 
     ""created_time"":""2011-11-04T21:32:50+0000""}}, 
    { 
    ""code"":200, 
    ""headers"":[{""name"":""Access-Control-Allow-Origin"",""value"":""*""}], 
    ""body"":{ 
     ""id"":""255572697884115_2"", 
     ""from"":{ 
      ""name"":""xyzk"", 
      ""id"":""59788447049""}, 
     ""message"":""This is the second message"", 
     ""created_time"":""2012-01-03T21:05:59+0000""}} 
]"; 
    var serializer = new JavaScriptSerializer(); 
    var result = serializer.Deserialize<dynamic>(json); 

    foreach(var item in result) 
    { 
     Console.WriteLine(item["body"]["message"]); 
    } 

} 

打印:

This is the first message 
This is the second message 
+0

謝謝您的非常快的答案。你是對的,你的代碼正在工作,但你手動刪除引號< "body":"{> - ><""body"":{>。我從webclient獲取字符串(實際上是一個流)。沒有任何機會反序列化沒有操縱? – Findus

+0

@DominicFrank我以爲你已經自己添加了這些引號,因爲整個字符串顯然被操縱了。您發佈的字符串不是有效的JSON。轉到http://jsonlint.com並粘貼到那裏。我也嘗試使用你發佈的確切字符串來運行代碼,它甚至沒有傳遞Deserialize行,因爲JavaScriptSerializer由於無效的JSON字符串而引發異常。無論如何,你正在做的錯誤是希望Serializer將創建一個強類型對象。除非你創建一個具有完全相同結構的類並繼續執行 – Icarus

+0

@DominicFrank,你可以告訴序列化器反序列化到該類型。看到這裏的例子:http://stackoverflow.com/questions/7895105/json-deserialize-c-sharp – Icarus

5

如果使用Json.Net,所有你需要做的就是

替代

var serializer = new JavaScriptSerializer(); 
var result = serializer.Deserialize<dynamic>(json); 

dynamic result = JsonConvert.DeserializeObject(json); 

僅此而已。

1

我使用這個簡單的技術

var responseTextFacebook = 
@"{ 
     "id":"100000891948867", 
     "name":"Nishant Sharma", 
     "first_name":"Nishant", 
     "last_name":"Sharma", 
     "link":"https:\/\/www.facebook.com\/profile.php?id=100000891948867", 
     "gender":"male", 
     "email":"nihantanu2010\u0040gmail.com", 
     "timezone":5.5, 
     "locale":"en_US", 
     "verified":true, 
     "updated_time":"2013-06-10T07:56:39+0000" 
    }" 

我已經聲明瞭一個類

public class RootObject 
    { 
     public string id { get; set; } 
     public string name { get; set; } 
     public string first_name { get; set; } 
     public string last_name { get; set; } 
     public string link { get; set; } 
     public string gender { get; set; } 
     public string email { get; set; } 
     public double timezone { get; set; } 
     public string locale { get; set; } 
     public bool verified { get; set; } 
     public string updated_time { get; set; } 
    } 

現在我反序列化

JavaScriptSerializer objJavaScriptSerializer = new JavaScriptSerializer(); 
RootObject parsedData = objJavaScriptSerializer.Deserialize<RootObject>(responseTextFacebook);