2010-02-20 146 views
0

我正在寫一個小型的Web服務,它以各種「主題」的形式生成SO/SF/SU/MSO用戶天賦。我覺得這比使用SO提供的HTML/JS解決方案更可取,因爲它更靈活,並且在論壇簽名方面效果更好。.Net正則表達式來解析特定的JSON格式

我使用顯然非官方的API(More info here)檢索數據。我可以使用HTML或JSON格式的數據。我認爲JSON會更容易解析。

不幸的是,我在正則表達式方面不太好。我能想到的最好的是一些非常hacky的子串。我相信正則表達式應該是最優雅的解決方案,但會歡迎其他建議。

有人可以請指出我正確的方向匹配 ID,GravatarURL,ProfileURL,顯示名稱,聲譽和徽章計數(青銅/銀/金)匹配的正則表達式。

FWIW這在VB.Net項目中使用(在影響該語法在所有情況下)

{"id":1,"gravatarHtml":"\u003cimg src=\"http://www.gravatar.com/avatar/51d623f33f8b83095db84ff35e15dbe8?s=50&d=identicon&r=PG\" height=\"50\" width=\"50\" alt=\"\"\u003e","profileUrl":"http://stackoverflow.com/users/1/jeff-atwood","displayName":"Jeff Atwood","reputation":"18,446","badgeHtml":"\u003cspan title=\"8 gold badges\"\u003e\u003cspan class=\"badge1\"\u003e●\u003c/span\u003e\u003cspan class=\"badgecount\"\u003e8\u003c/span\u003e\u003c/span\u003e\u003cspan title=\"57 silver badges\"\u003e\u003cspan class=\"badge2\"\u003e●\u003c/span\u003e\u003cspan class=\"badgecount\"\u003e57\u003c/span\u003e\u003c/span\u003e\u003cspan title=\"72 bronze badges\"\u003e\u003cspan class=\"badge3\"\u003e●\u003c/span\u003e\u003cspan class=\"badgecount\"\u003e72\u003c/span\u003e\u003c/span\u003e"} 

或稍微更可讀的格式:

{ 
"id":1, 
"gravatarHtml":"\u003cimg src=\"http://www.gravatar.com/avatar/51d623f33f8b83095db84ff35e15dbe8?s=50&d=identicon&r=PG\" height=\"50\" width=\"50\" alt=\"\"\u003e", 
"profileUrl":"http://stackoverflow.com/users/1/jeff-atwood", 
"displayName":"Jeff Atwood", 
"reputation":"18,446", 
"badgeHtml":" 
    \u003cspan title=\"8 gold badges\"\u003e\u003cspan class=\"badge1\"\u003e●\u003c/span\u003e\u003cspan class=\"badgecount\"\u003e8\u003c/span\u003e\u003c/span\u003e 
    \u003cspan title=\"57 silver badges\"\u003e\u003cspan class=\"badge2\"\u003e●\u003c/span\u003e\u003cspan class=\"badgecount\"\u003e57\u003c/span\u003e\u003c/span\u003e 
    \u003cspan title=\"72 bronze badges\"\u003e\u003cspan class=\"badge3\"\u003e●\u003c/span\u003e\u003cspan class=\"badgecount\"\u003e72\u003c/span\u003e\u003c/span\u003e 
" 
} 

(NB:值得注意的是,如果您沒有任何特定的徽章,則根本沒有該徽章的條目,而不是顯示「0」)。不幸的是,我甚至不知道從哪裏開始使用正則表達式所以任何幫助,建議或文檔不勝感激

[編輯]

,以防出現任何你感興趣,風騷作爲一項正在進行的工作的一些截圖,請瀏覽:MeJeff AtwoodJoel Spolsky

我如果任何人想要他們自己的話,會讓它公開嗎?

回答

3

你有沒有使用stackexchange-api

這裏是代碼樣本認爲你正在嘗試才達到

 User JeffAtwood = 
      User.GetUserWithId(123456, StackExchangeSite.StackOverflow); 

     long ID = JeffAtwood.Id; 
     Uri gravatarHtml = JeffAtwood.Gravatar; 
     String name = JeffAtwood.Name;   
     List<ReputationChange> repGraph = 
      JeffAtwood.ReputationGraph[DateTime.Now.AddDays(-3), DateTime.Now].ToList(); 
     long totalReputations = JeffAtwood.Reputation; 
     List<Badge> badges = JeffAtwood.Badges.ToList(); 
     . 
     . 

還有其他數百位就可以得到使用簡單的內置方法,除了請求,然後通過Json響應進行解析。

而對於解析傑森響應,在使用最好的圖書館是

+0

除了回答我的問題,你解決了它背後的問題。非常感謝。我不知道該API存在 - 肯定會成爲一個福音。 – Basic 2010-02-21 02:12:31

+0

希望能儘快看到SOF的驚人插件! – 2010-02-21 03:02:35

5

首先,不要使用正則表達式來解析JSON。與HTML一樣,JSON不是一種常規語言,因此正則表達式將無法真正解析它 - 只會提供較差的近似值,這很容易導致令人頭疼的道路。

相反,您可能希望查看JSON解析器,如JavaScriptSerializerJson.NET

+0

感謝 - 這比一個正則表達式一個更好的和有用的瞭解 – Basic 2010-02-21 02:07:35