如何在Swift中显示来自JSON的特定数据?

马可·阿尔梅达(Marco Almeida)

大家好,我正在尝试开发一个简单的应用程序,以从Yahoo Finance获取数据。现在,我可以从yahoo获得JSON响应,但是我只需要从中获得一个数据,即股票公司名称。那么我该如何实现呢?

我的代码:

import UIKit

class ViewController: UIViewController, NSURLConnectionDelegate {

lazy var data = NSMutableData()

override func viewDidLoad() {
    super.viewDidLoad()
    startConnection()
}

    func startConnection(){
    var baseUrl:NSURL = NSURL(string:"http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22PETR4.SA%22)&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=")!
    var request: NSURLRequest = NSURLRequest(URL: baseUrl)
    var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: true)!

}

func connection(didReceiveResponse: NSURLConnection!, didReceiveResponse response: NSURLResponse!) {

    // Recieved a new request, clear out the data object
    self.data = NSMutableData()

}

func connection(connection: NSURLConnection!, didReceiveData data: NSData!) {
    // Append the recieved chunk of data to our data object
    self.data.appendData(data)
}



func connectionDidFinishLoading(connection: NSURLConnection!) {
    // Request complete, self.data should now hold the resulting info
    // Convert the retrieved data in to an object through JSON deserialization

    var err: NSError
    var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary

    println(jsonResult)
}
}

回复:

{
query =     {
    count = 1;
    created = "2015-01-17T04:34:11Z";
    diagnostics =         {
        "build-version" = "0.2.212";
        cache =             {
            content = 5d1e1de680846a307c9874dc3d6878dc;
            "execution-start-time" = 4;
            "execution-stop-time" = 5;
            "execution-time" = 1;
            method = GET;
            type = MEMCACHED;
        };
        javascript =             {
            "execution-start-time" = 3;
            "execution-stop-time" = 104;
            "execution-time" = 101;
            "instructions-used" = 66631;
            "table-name" = "yahoo.finance.quotes";
        };
        publiclyCallable = true;
        query =             {
            content = "select * from csv where url=@url and columns='Ask,AverageDailyVolume,Bid,AskRealtime,BidRealtime,BookValue,Change&PercentChange,Change,Commission,Currency,ChangeRealtime,AfterHoursChangeRealtime,DividendShare,LastTradeDate,TradeDate,EarningsShare,ErrorIndicationreturnedforsymbolchangedinvalid,EPSEstimateCurrentYear,EPSEstimateNextYear,EPSEstimateNextQuarter,DaysLow,DaysHigh,YearLow,YearHigh,HoldingsGainPercent,AnnualizedGain,HoldingsGain,HoldingsGainPercentRealtime,HoldingsGainRealtime,MoreInfo,OrderBookRealtime,MarketCapitalization,MarketCapRealtime,EBITDA,ChangeFromYearLow,PercentChangeFromYearLow,LastTradeRealtimeWithTime,ChangePercentRealtime,ChangeFromYearHigh,PercebtChangeFromYearHigh,LastTradeWithTime,LastTradePriceOnly,HighLimit,LowLimit,DaysRange,DaysRangeRealtime,FiftydayMovingAverage,TwoHundreddayMovingAverage,ChangeFromTwoHundreddayMovingAverage,PercentChangeFromTwoHundreddayMovingAverage,ChangeFromFiftydayMovingAverage,PercentChangeFromFiftydayMovingAverage,Name,Notes,Open,PreviousClose,PricePaid,ChangeinPercent,PriceSales,PriceBook,ExDividendDate,PERatio,DividendPayDate,PERatioRealtime,PEGRatio,PriceEPSEstimateCurrentYear,PriceEPSEstimateNextYear,Symbol,SharesOwned,ShortRatio,LastTradeTime,TickerTrend,OneyrTargetPrice,Volume,HoldingsValue,HoldingsValueRealtime,YearRange,DaysValueChange,DaysValueChangeRealtime,StockExchange,DividendYield'";
            "execution-start-time" = 5;
            "execution-stop-time" = 95;
            "execution-time" = 90;
            params = "{url=[http://download.finance.yahoo.com/d/quotes.csv?f=aa2bb2b3b4cc1c3c4c6c8dd1d2ee1e7e8e9ghjkg1g3g4g5g6ii5j1j3j4j5j6k1k2k4k5ll1l2l3mm2m3m4m5m6m7m8nn4opp1p2p5p6qrr1r2r5r6r7ss1s7t1t7t8vv1v7ww1w4xy&s=PETR4.SA]}";
        };
        "service-time" = 91;
        url =             (
                            {
                content = "http://www.datatables.org/yahoo/finance/yahoo.finance.quotes.xml";
                "execution-start-time" = 1;
                "execution-stop-time" = 1;
                "execution-time" = 0;
            },
                            {
                content = "http://download.finance.yahoo.com/d/quotes.csv?f=aa2bb2b3b4cc1c3c4c6c8dd1d2ee1e7e8e9ghjkg1g3g4g5g6ii5j1j3j4j5j6k1k2k4k5ll1l2l3mm2m3m4m5m6m7m8nn4opp1p2p5p6qrr1r2r5r6r7ss1s7t1t7t8vv1v7ww1w4xy&s=PETR4.SA";
                "execution-start-time" = 5;
                "execution-stop-time" = 95;
                "execution-time" = 90;
            }
        );
        "user-time" = 106;
    };
    lang = "en-us";
    results =         {
        quote =             {
            AfterHoursChangeRealtime = "N/A - N/A";
            AnnualizedGain = "<null>";
            Ask = "9.45";
            AskRealtime = "9.45";
            AverageDailyVolume = 80999600;
            Bid = "9.44";
            BidRealtime = "9.44";
            BookValue = "27.652";
            Change = "+0.10";
            ChangeFromFiftydayMovingAverage = "-0.9209";
            ChangeFromTwoHundreddayMovingAverage = "-7.3725";
            ChangeFromYearHigh = "-15.46";
            ChangeFromYearLow = "+1.40";
            ChangePercentRealtime = "N/A - +1.07%";
            ChangeRealtime = "+0.10";
            "Change_PercentChange" = "+0.10 - +1.07%";
            ChangeinPercent = "+1.07%";
            Commission = "<null>";
            Currency = BRL;
            DaysHigh = "9.63";
            DaysLow = "9.24";
            DaysRange = "9.24 - 9.63";
            DaysRangeRealtime = "N/A - N/A";
            DaysValueChange = "- - +1.07%";
            DaysValueChangeRealtime = "N/A - N/A";
            DividendPayDate = "<null>";
            DividendShare = "0.9672";
            DividendYield = "10.36";
            EBITDA = "66.171B";
            EPSEstimateCurrentYear = "0.00";
            EPSEstimateNextQuarter = "0.00";
            EPSEstimateNextYear = "0.00";
            EarningsShare = "1.535";
            ErrorIndicationreturnedforsymbolchangedinvalid = "<null>";
            ExDividendDate = "3-Apr-14";
            FiftydayMovingAverage = "10.3609";
            HighLimit = "<null>";
            HoldingsGain = "<null>";
            HoldingsGainPercent = "- - -";
            HoldingsGainPercentRealtime = "N/A - N/A";
            HoldingsGainRealtime = "<null>";
            HoldingsValue = "<null>";
            HoldingsValueRealtime = "<null>";
            LastTradeDate = "1/16/2015";
            LastTradePriceOnly = "9.44";
            LastTradeRealtimeWithTime = "N/A - <b>9.44</b>";
            LastTradeTime = "2:08pm";
            LastTradeWithTime = "Jan 16 - <b>9.44</b>";
            LowLimit = "<null>";
            MarketCapRealtime = "<null>";
            MarketCapitalization = "123.1B";
            MoreInfo = cnpI;
            Name = "PETROBRAS   -PN";
            Notes = "<null>";
            OneyrTargetPrice = "<null>";
            Open = "9.46";
            OrderBookRealtime = "<null>";
            PEGRatio = "<null>";
            PERatio = "6.08";
            PERatioRealtime = "<null>";
            PercebtChangeFromYearHigh = "-62.09%";
            PercentChange = "+1.07%";
            PercentChangeFromFiftydayMovingAverage = "-8.89%";
            PercentChangeFromTwoHundreddayMovingAverage = "-43.85%";
            PercentChangeFromYearLow = "+17.41%";
            PreviousClose = "9.34";
            PriceBook = "0.34";
            PriceEPSEstimateCurrentYear = "<null>";
            PriceEPSEstimateNextYear = "<null>";
            PricePaid = "<null>";
            PriceSales = "0.38";
            SharesOwned = "<null>";
            ShortRatio = "<null>";
            StockExchange = "Sao Paolo";
            Symbol = "PETR4.SA";
            TickerTrend = "&nbsp;======&nbsp;";
            TradeDate = "<null>";
            TwoHundreddayMovingAverage = "16.8125";
            Volume = 56271000;
            YearHigh = "24.90";
            YearLow = "8.04";
            YearRange = "8.04 - 24.90";
            symbol = "PETR4.SA";
        };
    };
};
}
撤消

您从NSJSONSerialization中获得的对象是标准的NSDictionary,您可以这样操作它。因此,要获得公司名称,您需要访问:

  • 从NSJSONSerialization返回的对象获取“查询”字典
  • 从查询字典中获取“结果”字典
  • 从结果字典中获取“ quote”字典
  • 最后,从报价字典中获得名称对象。

您可以使用以下代码:

var query: NSDictionary = jsonResult["query"] as NSDictionary 
var results: NSDictionary = query["results"] as NSDictionary 
var quote: NSDictionary = results["quote"] as NSDictionary
var companyName: String = quote["Name"] as String
println(companyName)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在MongoDB中更新数组中的特定数据?

如何在Andorid Studio中显示JSON的特定数据

如何在熊猫数据框中显示特定数字

如何在php中显示来自特定mysql数据库的所有表名

如何在Python中从JSON API获取特定数据

如何使用Firebase在Spinner中显示特定数据?

如何显示来自API的特定JSON数据

如何在JSON结果中获取特定数据

如何在Django表单中显示特定数据?

如何在JSON数组中发送特定数据

无法弄清楚如何在Swift中遍历数组并查找特定数据

如何在Android中显示特定数量的通知

如何在ListBox中水平显示绑定数据

如何在mongodb中删除文档中的特定数据

如何在Google App Engine数据存储区中存储来自Android的用户特定数据。祖先与否?

如何在swift 4中显示子JSON数据?

如何从 Json 获取特定数据并在 Ruby on Rails 中显示在 Google 地图中

如何在 Swift 4 中从 JSON 中提取和制作特定数组?

如何使用 C# 显示来自 json 数组的特定数据

如何在 Android ListView 中显示来自 SQLite 数据库的特定数据

如何在javascript中访问json中的特定数据

如何使用 Firebase Auth 显示来自 Firebase 数据库的用户特定数据?

如何在 CupertinoPicker 中显示来自服务器的 json 数据

如何使用 JQuery 显示来自 JSON 的特定数据?

如何在 matplotlib 中绘制字典中的特定数据?

如何在 C# 中的数据库中显示组合框中的特定数据?

无法在 RecyclerView 中显示来自 firebase 的特定数据

如何在 html 表中显示来自 API 的 JSON 数据

如何在换行布局中打印 JSON 文件列表中的特定数据?