C# Работа с JSON

Здравствуйте уважаемые программисты! Сегодня я объясню кратко как работать с JSON.

Для начала процитирую из Википедии что это такое:
JSON (англ. JavaScript Object Notation) — текстовый формат обмена данными, основанный на JavaScript и обычно используемый именно с этим языком. Как и многие другие текстовые форматы, JSON легко
Этот формат оказался очень удобным так как он легко читается человеком и спарсить результаты не составит труда. Давайте рассмотрим пример. Я написав код для программы PowerCodX Seo Pack получал результаты в формате JSON с Google при помощью этой ссылки:
http://ajax.googleapis.com/ajax/services/search/web?v=1.0&rsz=large&safe=active&gl=ru&hl=ru&q=Test

А вот и ответ от Google:
{"responseData": {"results":[{"GsearchResultClass":"GwebSearch","unescapedUrl":"http://www.speedtest.net/","url":"http://www.speedtest.net/","visibleUrl":"www.speedtest.net","cacheUrl":"http://www.google.com/search?q\u003dcache:M47_v0xF3m8J:www.speedtest.net","title":"Speedtest.net - The Global Broadband Speed \u003cb\u003eTest\u003c/b\u003e","titleNoFormatting":"Speedtest.net - The Global Broadband Speed Test","content":"\u003cb\u003eTest\u003c/b\u003e your Internet connection bandwidth to locations around the world with this   interactive broadband speed \u003cb\u003etest\u003c/b\u003e."},{"GsearchResultClass":"GwebSearch","unescapedUrl":"http://www.xrite.com/online-color-test-challenge","url":"http://www.xrite.com/online-color-test-challenge","visibleUrl":"www.xrite.com","cacheUrl":"http://www.google.com/search?q\u003dcache:nceqIKISBgcJ:www.xrite.com","title":"Color \u003cb\u003eTest\u003c/b\u003e - Online Color Challenge | X-Rite","titleNoFormatting":"Color Test - Online Color Challenge | X-Rite","content":"Try out X-Rite\u0026#39;s free online color \u003cb\u003etest\u003c/b\u003e challenge to see how well you can   differentiate hues. Find out how well you see color and compare your results   today!"},{"GsearchResultClass":"GwebSearch","unescapedUrl":"http://test.tankionline.com/","url":"http://test.tankionline.com/","visibleUrl":"test.tankionline.com","cacheUrl":"http://www.google.com/search?q\u003dcache:FnYEdF0lpH0J:test.tankionline.com","title":"\u003cb\u003eTest\u003c/b\u003e Server: Tanki Online","titleNoFormatting":"Test Server: Tanki Online","content":"Ты оказался на тестовом сервере игры «Танки Онлайн». На тестовый   сервер имеют доступ члены тестовой группы и приглашенные ими игроки   для \u003cb\u003e...\u003c/b\u003e"},{"GsearchResultClass":"GwebSearch","unescapedUrl":"http://tests.kulichki.com/","url":"http://tests.kulichki.com/","visibleUrl":"tests.kulichki.com","cacheUrl":"http://www.google.com/search?q\u003dcache:gLG45GK0SWQJ:tests.kulichki.com","title":"Тесты. Психологические тесты онлайн. Пройдите тесты \u003cb\u003e...\u003c/b\u003e","titleNoFormatting":"Тесты. Психологические тесты онлайн. Пройдите тесты ...","content":"Среди множества психологических тестов есть серьезные, вопросов на 300,   которые выявляют о человеке такое, что ему не могло присниться в самом \u003cb\u003e...\u003c/b\u003e"},{"GsearchResultClass":"GwebSearch","unescapedUrl":"http://test-ipv6.com/","url":"http://test-ipv6.com/","visibleUrl":"test-ipv6.com","cacheUrl":"http://www.google.com/search?q\u003dcache:TYJZjqJSse8J:test-ipv6.com","title":"\u003cb\u003eTest\u003c/b\u003e your IPv6.","titleNoFormatting":"Test your IPv6.","content":"This will \u003cb\u003etest\u003c/b\u003e your browser and connection for IPv6 readiness, as well as show   you your current IPV4 and IPv6 address."},{"GsearchResultClass":"GwebSearch","unescapedUrl":"http://aeterna.qip.ru/","url":"http://aeterna.qip.ru/","visibleUrl":"aeterna.qip.ru","cacheUrl":"http://www.google.com/search?q\u003dcache:qwu28CHYFmgJ:aeterna.qip.ru","title":"Бесплатные онлайн тесты, опросы и гадания на Аетерна","titleNoFormatting":"Бесплатные онлайн тесты, опросы и гадания на Аетерна","content":"Влияние массовой культуры США на другие страны огромно, а вот чтобы кто  -то забабахал об этом \u003cb\u003eтест\u003c/b\u003e – такого я не видывал. \u003cb\u003eТест\u003c/b\u003e позволяет узнать \u003cb\u003e...\u003c/b\u003e"},{"GsearchResultClass":"GwebSearch","unescapedUrl":"http://www.test.com/","url":"http://www.test.com/","visibleUrl":"www.test.com","cacheUrl":"http://www.google.com/search?q\u003dcache:S9XHtkEncW8J:www.test.com","title":"Create \u003cb\u003eTests\u003c/b\u003e for Organizational Training and Certification Programs \u003cb\u003e...\u003c/b\u003e","titleNoFormatting":"Create Tests for Organizational Training and Certification Programs ...","content":"\u003cb\u003eTest\u003c/b\u003e.com provides a complete software solution for creating online \u003cb\u003etests\u003c/b\u003e and   managing enterprise and specialist certification programs, in up to 22 languages."},{"GsearchResultClass":"GwebSearch","unescapedUrl":"http://www.humanmetrics.com/cgi-win/jtypes2.asp","url":"http://www.humanmetrics.com/cgi-win/jtypes2.asp","visibleUrl":"www.humanmetrics.com","cacheUrl":"http://www.google.com/search?q\u003dcache:w_lAt3mgXcoJ:www.humanmetrics.com","title":"Personality \u003cb\u003etest\u003c/b\u003e based on C. Jung and I. Briggs Myers type theory","titleNoFormatting":"Personality test based on C. Jung and I. Briggs Myers type theory","content":"Personality \u003cb\u003etest\u003c/b\u003e based on C. Jung and I. Briggs Myers type theory provides your   type formula, type description, career choices."}],"cursor":{"resultCount":"246 000 000","pages":[{"start":"0","label":1},{"start":"8","label":2},{"start":"16","label":3},{"start":"24","label":4},{"start":"32","label":5},{"start":"40","label":6},{"start":"48","label":7},{"start":"56","label":8}],"estimatedResultCount":"246000000","currentPageIndex":0,"moreResultsUrl":"http://www.google.com/search?oe\u003dutf8\u0026ie\u003dutf8\u0026source\u003duds\u0026start\u003d0\u0026safe\u003dactive\u0026hl\u003dru\u0026q\u003dTest","searchResultTime":"0,13"}}, "responseDetails": null, "responseStatus": 200}
Посмотрев на ответ вы подумайте что здесь сложнее чем XML-код но JSON просто не отформатирован. Для решения этой задачи я использовал замечательный сайт jsonformatter.curiousconcept.com. После форматирования ответ выглядит так:
{
   "responseData":{
      "results":[
         {
            "GsearchResultClass":"GwebSearch",
            "unescapedUrl":"http://www.speedtest.net/",
            "url":"http://www.speedtest.net/",
            "visibleUrl":"www.speedtest.net",
            "cacheUrl":"http://www.google.com/search?q\u003dcache:M47_v0xF3m8J:www.speedtest.net",
            "title":"Speedtest.net - The Global Broadband Speed \u003cb\u003eTest\u003c/b\u003e",
            "titleNoFormatting":"Speedtest.net - The Global Broadband Speed Test",
            "content":"\u003cb\u003eTest\u003c/b\u003e your Internet connection bandwidth to locations around the world with this   interactive broadband speed \u003cb\u003etest\u003c/b\u003e."
         },
         {
            "GsearchResultClass":"GwebSearch",
            "unescapedUrl":"http://www.xrite.com/online-color-test-challenge",
            "url":"http://www.xrite.com/online-color-test-challenge",
            "visibleUrl":"www.xrite.com",
            "cacheUrl":"http://www.google.com/search?q\u003dcache:nceqIKISBgcJ:www.xrite.com",
            "title":"Color \u003cb\u003eTest\u003c/b\u003e - Online Color Challenge | X-Rite",
            "titleNoFormatting":"Color Test - Online Color Challenge | X-Rite",
            "content":"Try out X-Rite\u0026#39;s free online color \u003cb\u003etest\u003c/b\u003e challenge to see how well you can   differentiate hues. Find out how well you see color and compare your results   today!"
         },
         {
            "GsearchResultClass":"GwebSearch",
            "unescapedUrl":"http://test.tankionline.com/",
            "url":"http://test.tankionline.com/",
            "visibleUrl":"test.tankionline.com",
            "cacheUrl":"http://www.google.com/search?q\u003dcache:FnYEdF0lpH0J:test.tankionline.com",
            "title":"\u003cb\u003eTest\u003c/b\u003e Server: Tanki Online",
            "titleNoFormatting":"Test Server: Tanki Online",
            "content":"Ты оказался на тестовом сервере игры «Танки Онлайн». На тестовый   сервер имеют доступ члены тестовой группы и приглашенные ими игроки   для \u003cb\u003e...\u003c/b\u003e"
         },
         {
            "GsearchResultClass":"GwebSearch",
            "unescapedUrl":"http://tests.kulichki.com/",
            "url":"http://tests.kulichki.com/",
            "visibleUrl":"tests.kulichki.com",
            "cacheUrl":"http://www.google.com/search?q\u003dcache:gLG45GK0SWQJ:tests.kulichki.com",
            "title":"Тесты. Психологические тесты онлайн. Пройдите тесты \u003cb\u003e...\u003c/b\u003e",
            "titleNoFormatting":"Тесты. Психологические тесты онлайн. Пройдите тесты ...",
            "content":"Среди множества психологических тестов есть серьезные, вопросов на 300,   которые выявляют о человеке такое, что ему не могло присниться в самом \u003cb\u003e...\u003c/b\u003e"
         },
         {
            "GsearchResultClass":"GwebSearch",
            "unescapedUrl":"http://test-ipv6.com/",
            "url":"http://test-ipv6.com/",
            "visibleUrl":"test-ipv6.com",
            "cacheUrl":"http://www.google.com/search?q\u003dcache:TYJZjqJSse8J:test-ipv6.com",
            "title":"\u003cb\u003eTest\u003c/b\u003e your IPv6.",
            "titleNoFormatting":"Test your IPv6.",
            "content":"This will \u003cb\u003etest\u003c/b\u003e your browser and connection for IPv6 readiness, as well as show   you your current IPV4 and IPv6 address."
         },
         {
            "GsearchResultClass":"GwebSearch",
            "unescapedUrl":"http://aeterna.qip.ru/",
            "url":"http://aeterna.qip.ru/",
            "visibleUrl":"aeterna.qip.ru",
            "cacheUrl":"http://www.google.com/search?q\u003dcache:qwu28CHYFmgJ:aeterna.qip.ru",
            "title":"Бесплатные онлайн тесты, опросы и гадания на Аетерна",
            "titleNoFormatting":"Бесплатные онлайн тесты, опросы и гадания на Аетерна",
            "content":"Влияние массовой культуры США на другие страны огромно, а вот чтобы кто  -то забабахал об этом \u003cb\u003eтест\u003c/b\u003e – такого я не видывал. \u003cb\u003eТест\u003c/b\u003e позволяет узнать \u003cb\u003e...\u003c/b\u003e"
         },
         {
            "GsearchResultClass":"GwebSearch",
            "unescapedUrl":"http://www.test.com/",
            "url":"http://www.test.com/",
            "visibleUrl":"www.test.com",
            "cacheUrl":"http://www.google.com/search?q\u003dcache:S9XHtkEncW8J:www.test.com",
            "title":"Create \u003cb\u003eTests\u003c/b\u003e for Organizational Training and Certification Programs \u003cb\u003e...\u003c/b\u003e",
            "titleNoFormatting":"Create Tests for Organizational Training and Certification Programs ...",
            "content":"\u003cb\u003eTest\u003c/b\u003e.com provides a complete software solution for creating online \u003cb\u003etests\u003c/b\u003e and   managing enterprise and specialist certification programs, in up to 22 languages."
         },
         {
            "GsearchResultClass":"GwebSearch",
            "unescapedUrl":"http://www.humanmetrics.com/cgi-win/jtypes2.asp",
            "url":"http://www.humanmetrics.com/cgi-win/jtypes2.asp",
            "visibleUrl":"www.humanmetrics.com",
            "cacheUrl":"http://www.google.com/search?q\u003dcache:w_lAt3mgXcoJ:www.humanmetrics.com",
            "title":"Personality \u003cb\u003etest\u003c/b\u003e based on C. Jung and I. Briggs Myers type theory",
            "titleNoFormatting":"Personality test based on C. Jung and I. Briggs Myers type theory",
            "content":"Personality \u003cb\u003etest\u003c/b\u003e based on C. Jung and I. Briggs Myers type theory provides your   type formula, type description, career choices."
         }
      ],
      "cursor":{
         "resultCount":"246 000 000",
         "pages":[
            {
               "start":"0",
               "label":1
            },
            {
               "start":"8",
               "label":2
            },
            {
               "start":"16",
               "label":3
            },
            {
               "start":"24",
               "label":4
            },
            {
               "start":"32",
               "label":5
            },
            {
               "start":"40",
               "label":6
            },
            {
               "start":"48",
               "label":7
            },
            {
               "start":"56",
               "label":8
            }
         ],
         "estimatedResultCount":"246000000",
         "currentPageIndex":0,
         "moreResultsUrl":"http://www.google.com/search?oe\u003dutf8\u0026ie\u003dutf8\u0026source\u003duds\u0026start\u003d0\u0026safe\u003dactive\u0026hl\u003dru\u0026q\u003dTest",
         "searchResultTime":"0,13"
      }
   },
   "responseDetails":null,
   "responseStatus":200
}
Думаю теперь все будет понятно. Но сразу возникает вопрос: А как все-таки спарсить этот ответ? Какие методы использовать?

Для парсинга JSON ответа существует библиотека JSON.NET. Скачать вы ее можете здесь. Итак, давайте рассмотрим пример как получить результаты поиска:
            const string GoogleUrl = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&rsz=large&safe=active&gl=ru&hl=ru&q={0}";
            string searchString = searchText;

            string parsedUrl = TextParser.UrlParse(url);
            var webRequest = new WebClient().DownloadString(string.Format(GoogleUrl, searchString));
            var jsonObject = (JObject)JsonConvert.DeserializeObject(webRequest);
            var requestQuery = from result in jsonObject["responseData"]["results"].Children()
                               select
                                   new ResultModel(
                                   result.Value<string>("url"),
                                   result.Value<string>("title"),
                                   result.Value<string>("content"));
            int i = 1;
            var resultList = new List<ResultModel>();
            foreach (var resultModel in requestQuery)
            {
                string parsedUrlFromRequest = TextParser.UrlParse(resultModel.Url);
                if (parsedUrlFromRequest.IndexOf(parsedUrl, System.StringComparison.Ordinal) > -1)
                {
                    resultList.Add(resultModel);
                    MessageBox.Show(string.Format("Сайт: {0}, Поисковой запрос: {1}, Позиция: {2}", parsedUrl, searchText, i));
                }
                i++;
            }
Объяснять подробно я не буду как работает эта библиотека но вы можете посмотреть на официальным сайте примеры.

Ну вот и все. Если заметили грамматические ошибки или работоспособность кода нарушена пишите в комментариях или на почту: powercodx@mail.ru
Автор: PowerCodX, 2013

Comentarii

Postări populare de pe acest blog

[.NET] C# Разделить строку на слова

C# - Перемешать Массив

C# взаимодействие с сайтом