2

我正在尝试使用一个简单的 web api,它使用AFJSONRequestOperation.

Results; (
    {
    Category = Groceries;
    Id = 1;
    Name = "Tomato Soup";
    Price = 1;
},
    {
    Category = Toys;
    Id = 2;
    Name = "Yo-yo";
    Price = "3.75";
},
    {
    Category = Hardware;
    Id = 3;
    Name = Hammer;
    Price = "16.99";
}
)

我的 Objective-C 调用如下所示:

//not the real URL, just put in to show the variable being set
NSURL *url = [NSURL URLWithString:@"http://someapi"];

NSURLRequest *request = [NSURLRequest requestWithURL:url];    
AFJSONRequestOperation *operation;    
operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request

                                                            success: ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
                NSLog(@"Results; %@", JSON);
                self.resultsArray= [JSON objectForKey:@"Results"];
             }

                                                            failure: ^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error ,id JSON) {
                 //http status code
                 NSLog(@"Received Error: %d", response.statusCode);
                 NSLog(@"Error is: %@", error);
             }
             ];

//run service
[operation start];

当我运行我的代码时,我可以看到 NSLog 语句中返回的数据。但是,当我尝试使用 JSON objectForKey 语句将结果设置到我的数组时出现以下错误。

-[__NSCFArray objectForKey:]: unrecognized selector sent to instance 0xe466510
2013-09-30 20:49:03.893 ITPMessageViewer[97459:a0b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFArray objectForKey:]: unrecognized selector sent to instance 0xe466510'

我对 Objective-C 还很陌生,无法弄清楚为什么这不起作用。任何帮助或想法将不胜感激。

4

3 回答 3

4

你得到的结果是一个数组

objectForKey:是一个 NSDictionary 方法

所以使用valueForKey:which 是一个 NSArray 方法。

self.resultsArray= [JSON valueForKey:@"Results"];
于 2013-10-01T02:07:52.513 回答
0

在您的代码中,JSON(结果)需要遵循此方法才能使用:

    self.resultsArray = (NSArray *)JSON;

它会为你的 self.resultsArray 类型强制“id”类型为 NSArray(它是一个 NSArray,对吗?),然后你可以使用这个方法来枚举它。

    [self.resultsArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
    {
        NSDictionary *_eachResult = (NSDictionary *)obj;
        [_eachResult objectForKey:@"Category"];
        //... 
    }];

希望它可以帮助你。

于 2013-10-01T02:59:34.087 回答
0

我设法更新了我的 Web 服务,以 AFJSONRequestOperation 满意的格式返回数据。这使我能够正确解析 JSON。仍然不确定为什么它需要这个字典组合,但很高兴它起作用了。

如果有人在 C# 中编写 Web api 来与目标 C 对话,这就是我所做的:

更新是将以下对象作为 JSON 返回(代码在 C# 中)。

Dictionary > with string = "results" 和 IEnumerable 是我的强类型对象数组。

public Dictionary<string, IEnumerable<Product>> GetAllProducts()
        {
            var sortedProuct = results.OrderBy(a => a.Category);

            var proddict = new Dictionary<string, IEnumerable<Product>>()
            {
                { "results", results}, 
            };

            return proddict;
        }

这转化为:

Results; {
results = ({
Category = Groceries;
Id = 1;
Name = "Tomato Soup";
Price = 1;},

……

于 2013-10-03T15:06:43.263 回答