2012-03-14 53 views
0

我試圖解碼使用JSONConvert從NewtonSoft.Json如何在C#解碼JSON

我創造了這個類來模仿Twitter的狀態對象從Twitter流API收到JSON

class tweeter 
{ 
    public string geo { get; set; } 
    public string text { get; set; } 
    public string name { get; set; } 
    public string screen_name { get; set; } 
    public string created_at { get; set; } 
    public string id { get; set; } 

} 

然後在我的代碼我下面對其進行解碼

try 
       { 
        System.Threading.Interlocked.Increment(ref linesRead); 
        var des = JsonConvert.DeserializeObject<tweeter>(e.Line); 
        listBox1.Items.Add(e.Line); 

        dbhelper.insertTweet(des.id,des.screen_name,des.text,des.created_at,"","","", com); 

        listBox1.SelectedIndex = listBox1.Items.Count - 1; 

        listBox1.SelectedIndex = -1; 
        label1.Text = string.Format("Lines Read: {0:F0}", linesRead); 
       } 
       catch (Exception x) 
       { 
        MessageBox.Show(x.Message); 
       } 

然而,像SCREEN_NAME嵌套的元素,例如,總是返回null,我該如何訪問這些嵌套的元素?

其他根元素(如geo,text,created_at,id)通常會返回並且具有值。

編輯:這是從進料樣品{"in_reply_to_status_id":null,"favorited":false,"text":"Haa I'm joking everyone I wish! Need it for #ibiza2012 and #Egypt","in_reply_to_status_id_str":null,"entities":{"hashtags":[{"text":"ibiza2012","indices":[44,54]},{"text":"Egypt","indices":[59,65]}],"urls":[],"user_mentions":[]},"geo":null,"retweet_count":0,"place":null,"truncated":false,"created_at":"Wed Mar 14 15:14:47 +0000 2012","in_reply_to_user_id_str":null,"source":"\u003Ca href=\"http:\/\/twitter.com\/#!\/download\/iphone\" rel=\"nofollow\"\u003ETwitter for iPhone\u003C\/a\u003E","retweeted":false,"in_reply_to_screen_name":null,"coordinates":null,"in_reply_to_user_id":null,"user":{"contributors_enabled":false,"geo_enabled":false,"profile_sidebar_fill_color":"DDEEF6","lang":"en","listed_count":0,"created_at":"Sat Apr 11 17:12:45 +0000 2009","profile_sidebar_border_color":"C0DEED","is_translator":false,"show_all_inline_media":true,"follow_request_sent":null,"verified":false,"url":null,"description":"Ibiza 2012 for openings! Have a bang on that!","default_profile":true,"following":null,"profile_use_background_image":true,"time_zone":null,"profile_text_color":"333333","statuses_count":2513,"notifications":null,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png","location":"London","profile_link_color":"0084B4","followers_count":350,"protected":false,"profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1895048740\/image_normal.jpg","profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1895048740\/image_normal.jpg","default_profile_image":false,"screen_name":"wyatt69","name":"Dean Wyatt","favourites_count":0,"profile_background_color":"C0DEED","id":30482455,"id_str":"30482455","profile_background_tile":false,"utc_offset":null,"friends_count":384},"id":179948698397196288,"id_str":"179948698397196288","contributors":null} d":false,"profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1673331511\/logo-for-twitter_normal.png","profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1673331511\/logo-for-twitter_normal.png","default_profile_image":false,"screen_name":"itwitex","name":"itwitex","favourites_count":0,"profile_background_color":"EBEBEB","id":307251688,"id_str":"307251688","profile_background_tile":false,"utc_offset":3600,"friends_count":0},"id":179948696308432896,"possibly_sensitive_editable":true,"possibly_sensitive":false,"id_str":"179948696308432896","contributors":null}

+0

可能重複(http://stackoverflow.com/questions/401756/parsing-json-using-json-net ) – 2012-03-14 15:09:39

+0

添加JSON數據看起來像從Twitter獲取的內容。 – 2012-03-14 15:09:45

+0

你能否提供來自該提要的JSON樣本? – 2012-03-14 15:09:46

回答

2

最近,我不得不這樣做某些應用程序的內部測試類似。我處理的情況類似下面的內容:

[DataContract] 
class Tweeter 
{ 
    [DataMember] 
    public string geo {get;set;} 
    [DataMember] 
    public User user {get;set;} 
} 

[DataContract] 
class User 
{ 
    [DataMember] 
    public string screen_name {get;set;} 
} 

class Converter 
{ 
    public Tweeter ConvertJson(string json) 
    { 
     DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Tweeter)); 

     using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json))) 
     { 
      return serializer.ReadObject(ms) as Tweeter; 
     } 
    } 
} 
[解析JSON使用Json.net]的
+0

這是在.net 4嗎?coz我只能使用.net 3.5 – KamalSalem 2012-03-14 15:30:16

+0

我的代碼是用.NET 4編寫的,但在.NET 3.5中支持序列化器 - http://msdn.microsoft.com/zh-cn/library/system.runtime.serialization.json.datacontractjsonserializer( v = vs.90).aspx – 2012-03-14 15:34:23

+0

Visual Studio報告找不到DataContract – KamalSalem 2012-03-14 15:47:50