2010-02-20 3 views
0

Я пишу небольшую веб-службу, которая генерирует пользовательский талант SO/SF/SU/MSO в виде изображения с различными «темами». Я считаю это предпочтительным использовать решения HTML/JS, предлагаемые SO, поскольку он более гибкий, а также лучше работает в сигнатурах форума..Net Regex для разбора конкретного формата JSON

Я извлекаю данные, используя, по-видимому, неофициальный API (More info here). Я могу иметь данные в HTML или JSON. Я предположил, что JSON будет легче разобрать.

К сожалению, я не большой в регулярных выражениях. и лучшее, что я могу придумать, - это очень хакерская подстрочка. Я считаю, что регулярное выражение должно быть самым элегантным решением, но приветствовать другие предложения.

Может кто-нибудь указать мне в правильном направлении для регулярного выражения, которое соответствует ID, GravatarURL, ProfileURL, DisplayName, репутации и значка (бронза/серебро/золото).

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»)

К сожалению, я даже не знаю, с чего начать с регулярного выражения поэтому любая помощь , Предложения или документация высоко оценило

[Редактировать]

В случае, если любой из вас интересует, некоторые скриншоты чутья как незавершенные доступен здесь: Me, Jeff Atwood, Joel Spolsky

Я сделаете его общедоступным, если кто-то захочет их?

[/ Edit]

ответ

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.

И для разбора Jason Response, лучшая библиотека для использования является

+0

Как также отвечая на мой вопрос, вы решил проблему за ней. Большое спасибо. Я понятия не имел, что API существует - определенно будет благом. – Basic

+0

надеюсь увидеть потрясающую надстройку для SOF в ближайшее время! –

5

Прежде всего, не следует использовать регулярное выражение для разбора JSON. Подобно HTML, JSON не является обычным языком, и поэтому регулярные выражения не смогут по-настоящему разобрать его - только обеспечивают низкое приближение, что может легко привести к головным болям в будущем.

Вместо этого вы, вероятно, захотите изучить парсеров JSON, например JavaScriptSerializer или Json.NET.

+0

Спасибо - Это гораздо лучше, чем регулярное выражение и полезно знать – Basic

Смежные вопросы