在 iOS 的 RestKit 中解析嵌套的 JSON

Posted

技术标签:

【中文标题】在 iOS 的 RestKit 中解析嵌套的 JSON【英文标题】:Parsing nested JSON in RestKit for iOS 【发布时间】:2014-12-07 23:22:44 【问题描述】:

这是我要解析的 JSON:http://query.yahooapis.com/v1/public/yql?q=select%20Name,LastTradePriceOnly%20from%20yahoo.finance.quotes%20where%20symbol%20in%20('YHOO','AAPL','GOOG','MSFT')&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=

(我在这里无法正确格式化,所以我提供了一个链接。)



    "query": 
        "count": 4,
        "created": "2014-12-08T02:46:32Z",
        "lang": "en-US",
        "results": 
            "quote": [
                
                    "LastTradePriceOnly": "50.99",
                    "Name": "Yahoo! Inc."
                ,
                
                    "LastTradePriceOnly": "115.00",
                    "Name": "Apple Inc."
                ,
                
                    "LastTradePriceOnly": "525.26",
                    "Name": "Google Inc."
                ,
                
                    "LastTradePriceOnly": "48.42",
                    "Name": "Microsoft Corpora"
                
            ]
        
    


我想从“报价”部分获取信息,但我不知道如何去那里。

这是我的代码:

func getSampleStocksFromYahoo(query:String, successBlock:StocksResponseSuccessBlock, failureBlock:StocksResponseFailureBlock)

    let url = NSURL(string:query)

    let urlRequest = NSURLRequest(URL: url!)


    var stockMapping:RKObjectMapping = RKObjectMapping(forClass:Stock.self)
        stockMapping.addAttributeMappingsFromDictionary(["Name":"name"])

    var rDescriptor:RKResponseDescriptor = RKResponseDescriptor(mapping: stockMapping, method: RKRequestMethod.GET, pathPattern: nil, keyPath: nil, statusCodes: nil)

    var request:RKObjectRequestOperation = RKObjectRequestOperation(request: urlRequest, responseDescriptors: [rDescriptor])

    request.setCompletionBlockWithSuccess(successBlock, failure: failureBlock)
    request.start()



如何设置我的映射,使其从“报价”部分开始?

【问题讨论】:

您提供的 XML 文件链接说它由于某种原因缺少一些参数。 嗨,肖恩,一半的链接不可点击。如果您可以复制并粘贴整个网址,它将起作用。 哇。抱歉,让我快速查看所有内容。我想我也忘了突出显示最后一个回调部分。 所以我知道该怎么做,但是我不能正确地将它移植到 Swift,因为我对这种语言不太了解?你想看看目标c代码吗? Objective-C 代码会非常好! 【参考方案1】:

抱歉,因为我正在做某事,所以花了这么长时间才发布。你说 Objective-c 的答案可以代替 Swift,所以你去吧!

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://query.yahooapis.com/v1/public/yql?q=select%20Name,LastTradePriceOnly%20from%20yahoo.finance.quotes%20where%20symbol%20in%20('YHOO','AAPL','GOOG','MSFT')&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback="]];
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler: ^(NSURLResponse *response, NSData *data, NSError *connectionError)

    NSHTTPURLResponse *httpUrlResponse = (NSHTTPURLResponse*) response;
    if (!connectionError && httpUrlResponse.statusCode == 200)
    
        NSError *jsonError = nil;
        NSDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&jsonError];
        if (!jsonError)
        
            NSArray *quotes = [[[responseDictionary objectForKey:@"query"] objectForKey:@"results"] objectForKey:@"quote"];

            for (int index = 0; index < quotes.count; index++)
            
                NSDictionary *quoteInformation = [quotes objectAtIndex:index];
                NSLog(@"Name: %@", [quoteInformation objectForKey:@"Name"]);
                NSLog(@"LastTradePriceOnly: %@", [quoteInformation objectForKey:@"LastTradePriceOnly"]);
            
        
    
];

【讨论】:

尽管这不是我想要的,因为这段代码不涉及 RestKit,但这个解决方案是完全可以接受的。我自己测试了代码,它运行良好。谢谢肖恩 没问题,如果你愿意,我可以制作一个 RestKit 版本。 如果您有时间并且不介意这样做,那将是非常棒的,我将非常感谢您的时间和精力! :-)

以上是关于在 iOS 的 RestKit 中解析嵌套的 JSON的主要内容,如果未能解决你的问题,请参考以下文章

iOS上的RestKit - 嵌套对象的后续API调用?

Restkit 映射复杂的嵌套数组

如何使用 RestKit 将嵌套的 JSON 对象存储到核心数据中

RestKit 0.20:映射复杂的动态嵌套 JSON

RestKit - 发布或放置包含嵌套实体的实体

iOS RestKit 0.2 解析本地 Json 的最佳方法是啥