2010-02-20 147 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