2012-02-21 68 views
0

我通過JSON文件試圖循環,並從雅虎API檢索每個記錄的標題。有人可以給我一些關於如何做到這一點的指示。我的代碼如下:C#的Java序列化問題

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); 
+0

什麼是JSON是什麼樣子? – 2012-02-21 12:11:22

回答

1

您可以設計幾個類來匹配雅虎返回的JSON結構。否則雅虎返回JSONP而不是JSON也不要使用callback=cbfunc參數:

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); 
      } 

     } 
    } 
} 
+0

其實我試過這事不是早就沒有成功。你有能力做這個工作嗎? – 2012-02-21 12:39:55

+0

@ W.Jackson,是的,我剛剛測試此代碼和它的工作完美的罰款。 – 2012-02-21 12:40:52

+0

+1,回答得有人問這個問題。 – 2012-02-21 13:25:16

0

你需要使用JSON的客戶端的目的?如果不是我可能會建議改變你的結果格式爲XML,格式= XML,並使用LINQ to XML。然後,你可以這樣做:

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;