2

を使用して、Objective C で以下のデータを返す単純な 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

0

コードでは、JSON ( result ) は次のメソッドに従って使用する必要があります。

    self.resultsArray = (NSArray *)JSON;

「 id 」タイプを self.resultsArray タイプの 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

AFJSONRequestOperation が満足する形式でデータを返すように Web サービスを更新することができました。これにより、JSON を適切に解析することができました。なぜこの辞書コンボが必要なのかはまだわかりませんが、機能してよかったです。

目的の C と通信するために C# で Web API を作成している場合は、次のようにします。

更新は、次のオブジェクトを 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 に答える