Question

I'm trying to loop through a json file and retrieve the title of each record from a yahoo api. Can someone please give me some pointers as to how I need to do this. My code is as follows:

   HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20local.search%20where%20query%3D%22sushi%22%20and%20location%3D%22san%20francisco%2C%20ca%22&format=json&diagnostics=true&callback=cbfunc");
            HttpWebResponse rep = (HttpWebResponse)req.GetResponse();

            StreamReader sr = new StreamReader(rep.GetResponseStream());

            string data = sr.ReadToEnd();

            //Console.WriteLine(data); 

            var jss = new JavaScriptSerializer();
            var dict = jss.Deserialize<Dictionary<string,string>>(data);
Was it helpful?

Solution

You could design a couple of classes to match the JSON structure returned by yahoo. Also don't use the callback=cbfunc parameter because otherwise yahoo returns JSONP instead of JSON:

using System;
using System.Net;
using System.Web.Script.Serialization;

public class YahooResponse
{
    public Query Query { get; set; }
}

public class Query
{
    public Results Results { get; set; }
}

public class Results
{
    public Result[] Result { get; set; }
}

public class Result
{
    public string Title { get; set; }
}

class Program
{
    static void Main()
    {
        using (var client = new WebClient())
        {
            var json = client.DownloadString("http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20local.search%20where%20query%3D%22sushi%22%20and%20location%3D%22san%20francisco%2C%20ca%22&format=json&diagnostics=true")
            var jss = new JavaScriptSerializer();
            var result = jss.Deserialize<YahooResponse>(json);
            foreach (var item in result.Query.Results.Result)
            {
                Console.WriteLine(item.Title);
            }

        }
    }
}

OTHER TIPS

Do you need to use json for client side purposes? If not I might suggest changing your result format to xml, format=xml, and using linq to xml. Then you could do this:

if (tickers.Count() == 0)
            throw new InvalidOperationException("The list of tickers cannot be empty.");

        string url = BuildUrl(tickers);

        WebClient http = new WebClient();            
        string xml = http.DownloadString(url);

        List<Quote> quotes = new List<Quote>();

        XDocument doc = XDocument.Parse(xml);
        foreach (var el in doc.Descendants("quote"))
        {
            if (el.Name == "quote")
            {
                quotes.Add(new Quote()
                {
                    Symbol = el.Element("Symbol").Value,                        
                    TradeDate = el.Element("TradeDate").Value,
                    DaysLow = el.Element("DaysLow").IsEmpty ? null : (decimal?)el.Element("DaysLow"),
                    DaysHigh = el.Element("DaysHigh").IsEmpty ? null :(decimal?)el.Element("DaysHigh"),
                    YearLow = el.Element("YearLow").IsEmpty ? null : (decimal?)el.Element("YearLow"),
                    YearHigh = el.Element("YearHigh").IsEmpty ? null : (decimal?)el.Element("YearHigh"),
                    DividendShare = el.Element("DividendShare").IsEmpty ? null : (decimal?)el.Element("DividendShare"),
                    Open = el.Element("Open").IsEmpty ? null : (decimal?)el.Element("Open"),
                    PreviousClose = el.Element("PreviousClose").IsEmpty ? null : (decimal?)el.Element("PreviousClose"),
                    ShortRatio = el.Element("ShortRatio").IsEmpty ? null : (decimal?)el.Element("ShortRatio"),
                    OneyrTargetPrice = el.Element("OneyrTargetPrice").IsEmpty ? null : (decimal?)el.Element("OneyrTargetPrice"),
                    DividendYield = el.Element("DividendYield").IsEmpty ? null : (decimal?)el.Element("DividendYield"),
                    Ask = el.Element("Ask").IsEmpty ?  null : (decimal?)el.Element("Ask"),
                    Bid = el.Element("Bid").IsEmpty ? null : (decimal?)el.Element("Bid"),
                    AskRealtime = el.Element("AskRealtime").IsEmpty ? null : (decimal?)el.Element("AskRealtime"),
                    BidRealtime = el.Element("BidRealtime").IsEmpty ? null : (decimal?)el.Element("BidRealtime"),
                    BookValue = el.Element("BookValue").IsEmpty ? null : (decimal?)el.Element("BookValue"),                                
                    PercentChangeFromYearLow = el.Element("PercentChangeFromYearLow").Value,
                    LastTradeRealtimeWithTime = el.Element("LastTradeRealtimeWithTime").Value,
                    PercebtChangeFromYearHigh = el.Element("PercebtChangeFromYearHigh").Value,
                    LastTradeWithTime = el.Element("LastTradeWithTime").Value,
                    LastTradePriceOnly = el.Element("LastTradePriceOnly").Value,
                    Name = el.Element("Name").Value,
                    Notes = el.Element("Notes").Value,
                    LastTradeTime = el.Element("LastTradeTime").Value,
                    TickerTrend = el.Element("TickerTrend").Value,
                    StockExchange = el.Element("StockExchange").Value,
                    PercentChange = el.Element("PercentChange").Value,
                    AverageDailyVolume = (Int64?)el.Element("AverageDailyVolume"),
                    Change_PercentChange = el.Element("Change_PercentChange").Value,
                    Change = el.Element("Change").Value,
                    Commission = el.Element("Commission").Value,
                    ChangeRealtime = el.Element("ChangeRealtime").Value,
                    LastTradeDate = el.Element("LastTradeDate").Value
                });
            }
        }

        return quotes;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top