.Net Regex для анализа конкретного формата JSON - PullRequest
0 голосов
/ 21 февраля 2010

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

Я получаю данные, используя неофициальный API ( Подробнее здесь ). Я могу иметь данные в 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]

Ответы [ 2 ]

5 голосов
/ 21 февраля 2010

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

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

3 голосов
/ 21 февраля 2010

Рассматривали ли вы использование 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 лучше всего использовать библиотеку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...