3

I'm working on a project in C# in which I want to enter a search term, hit the search button and then retrieve parts of the response from Google to an array so I can iterate through them.

Searching Google using their JSON-based API is pretty easy

var client = new HttpClient();
var address = new Uri("https://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=" + term);

HttpResponseMessage response = await client.GetAsync(address);
String stream = await response.Content.ReadAsStringAsync();

This returns a JSON string like the one below (Results for the term "Test search")

{
    "responseData":{
        "results":[
            {
                "GsearchResultClass":"GwebSearch",
                "unescapedUrl":"http://en.wikipedia.org/wiki/Wikipedia:Search_engine_test",
                "url":"http://en.wikipedia.org/wiki/Wikipedia:Search_engine_test",
                "visibleUrl":"en.wikipedia.org",
                "cacheUrl":"http://www.google.com/search?q\u003dcache:g6KEStELS_MJ:en.wikipedia.org",
                "title":"Wikipedia:\u003cb\u003eSearch\u003c/b\u003eengine\u003cb\u003etest\u003c/b\u003e-Wikipedia,thefreeencyclopedia",
                "titleNoFormatting":"Wikipedia:Searchenginetest-Wikipedia,thefreeencyclopedia",
                "content":"A\u003cb\u003esearch\u003c/b\u003eengine\u003cb\u003etest\u003c/b\u003ecannothelpyouavoidtheworkofinterpretingyourresultsanddecidingwhattheyreallyshow.Appearanceinanindexaloneisnotusually\u003cb\u003e...\u003c/b\u003e"
             },
             {
                 "GsearchResultClass":"GwebSearch",
                 "unescapedUrl":"http://techcrunch.com/2008/07/16/google-continues-to-test-a-search-interface-that-looks-more-like-digg-every-day/",
                 "url":"http://techcrunch.com/2008/07/16/google-continues-to-test-a-search-interface-that-looks-more-like-digg-every-day/",
                 "visibleUrl":"techcrunch.com",
                 "cacheUrl":"http://www.google.com/search?q\u003dcache:r2laSUVQw8kJ:techcrunch.com",
                 "title":"GoogleContinuesTo\u003cb\u003eTest\u003c/b\u003eA\u003cb\u003eSearch\u003c/b\u003eInterfaceThatLooksMoreLike\u003cb\u003e...\u003c/b\u003e",
                 "titleNoFormatting":"GoogleContinuesToTestASearchInterfaceThatLooksMoreLike...",
                 "content":"Jul16,2008\u003cb\u003e...\u003c/b\u003eAcoupleofdaysagowepostedscreenshotsofanew\u003cb\u003esearch\u003c/b\u003einterfacebeingbucket\u003cb\u003etested\u003c/b\u003ebyGooglethatletsusersvoteupordownon\u003cb\u003e...\u003c/b\u003e"
             },
             {
                "GsearchResultClass":"GwebSearch",
                "unescapedUrl":"http://googleblog.blogspot.com/2006/04/this-is-test-this-is-only-test.html",
                "url":"http://googleblog.blogspot.com/2006/04/this-is-test-this-is-only-test.html",
                "visibleUrl":"googleblog.blogspot.com",
                "cacheUrl":"http://www.google.com/search?q\u003dcache:Ozl1cQzRT0IJ:googleblog.blogspot.com",
                "title":"Thisisa\u003cb\u003etest\u003c/b\u003e.Thisisonlya\u003cb\u003etest\u003c/b\u003e.|OfficialGoogleBlog",
                "titleNoFormatting":"Thisisatest.Thisisonlyatest.|OfficialGoogleBlog",
                "content":"Apr24,2006\u003cb\u003e...\u003c/b\u003eFromtimetotime,werunliveexperimentsonGoogle—\u003cb\u003etests\u003c/b\u003evisibletoarelativelyfewpeople--todiscoverbetterwaysto\u003cb\u003esearch\u003c/b\u003e.Wedothis\u003cb\u003e...\u003c/b\u003e"
             },
             {
                "GsearchResultClass":"GwebSearch",
                "unescapedUrl":"http://alistapart.com/article/testing-search-for-relevancy-and-precision",
                "url":"http://alistapart.com/article/testing-search-for-relevancy-and-precision",
                "visibleUrl":"alistapart.com",
                "cacheUrl":"http://www.google.com/search?q\u003dcache:02Sjrd5mb0YJ:alistapart.com",
                "title":"\u003cb\u003eTestingSearch\u003c/b\u003eforRelevancyandPrecision·AnAListApartArticle",
                "titleNoFormatting":"TestingSearchforRelevancyandPrecision·AnAListApartArticle",
                "content":"Sep22,2009\u003cb\u003e...\u003c/b\u003eDespitethefactthatsite\u003cb\u003esearch\u003c/b\u003eoftenreceivesthemosttraffic,it\u0026#39;salsotheplacewheretheuserexperiencedesignerbearstheleastinfluence."
             }
          ],
          "cursor":{
             "resultCount":"1,010,000,000",
             "pages":[
                {
                   "start":"0",
                   "label":1
                },
                {
                   "start":"4",
                   "label":2
                },
                {
                   "start":"8",
                   "label":3
                },
                {
                   "start":"12",
                   "label":4
                },
                {
                   "start":"16",
                   "label":5
                },
                {
                   "start":"20",
                   "label":6
                },
                {
                   "start":"24",
                   "label":7
                },
                {
                   "start":"28",
                   "label":8
                }
             ],
             "estimatedResultCount":"1010000000",
             "currentPageIndex":0,
             "moreResultsUrl":"http://www.google.com/search?oe\u003dutf8\u0026ie\u003dutf8\u0026source\u003duds\u0026start\u003d0\u0026hl\u003den\u0026q\u003dTest+search",
             "searchResultTime":"0.23"
          }
       },
       "responseDetails":null,
       "responseStatus":200
    }

How do I get the value of url in each node pushed into an array so I can iterate through it?

1
  • "The Google Web Search API is no longer available. Please migrate to the Google Custom Search API (developers.google.com/custom-search)" Commented Jan 22, 2018 at 12:24

1 Answer 1

2

You can use dynamic keyword with Json.Net

dynamic jObj = JsonConvert.DeserializeObject(json);
foreach (var res in jObj.responseData.results)
{
    Console.WriteLine("{0} => {1}\n",res.title,res.url);
}

You can use Linq too

var jObj = (JObject)JsonConvert.DeserializeObject(json);
string[] urls = jObj["responseData"]["results"]
                .Select(x => (string)x["url"])
                .ToArray(); 
Sign up to request clarification or add additional context in comments.

2 Comments

I tried using the dynamic keyword method thingy, and then instead of Console.WriteLine I created a list (before the loop) with List<String> threads = new List<String>(); (I'm using it to search for forum threads, hence the name of the list). Then I call threads.Add(res.url) and I get the following error: The best overloaded method match for 'System.Collections.Generic.List<string>.Add(string)' has some invalid arguments
@TimeSheep try threads.Add(res.url.ToString()) or threads.Add((string)res.url)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.