Получить идентификаторы продуктов из json Restful и заполнить его

#ios #objective-c #json

#iOS #objective-c #json

Вопрос:

У меня есть RESTUL json WCF возвращаемые значения выглядит следующим образом

 {
n  "Id": 1,
n  "ShortString": "test1",
n  "Description": "test1"
n}",
    "{
n  "Id": 2,
n  "ShortString": "test2",
n  "Description": "test2"
n}",
    "{
n  "Id": 3,
n  "ShortString": "test3",
n  "Description": "test3"
n}",
 

Я пытаюсь захватить их в NSMutableArray классе, используя следующий код:

 #import <Foundation/Foundation.h>
#import "CategoryModel.h"

@protocol CategoryModel @end

@interface CategoryModel : NSObject

@property (assign) int Id;
@property (strong, nonatomic) NSString* ShortString;
@property (strong, nonatomic) NSString* Description;
@property (assign) bool IsPurchased;

@end
 

и использование синтаксического анализатора json для получения данных:

 NSURL* categoryURL = [NSURL URLWithString:@"testserver/Categories"];

    NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:categoryURL];

    [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError)
    {

        // Parse JSON
        NSError* jsonError;
                NSArray* json =[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:amp;jsonError];

         NSLog(@"The Results %@",json);

        if(json)
        {

            Categories = [[NSMutableArray alloc] init];

            for(NSDictionary* category in json)
            {
                 categoryobject.Id = [((NSNumber *)[category objectForKey:@"Id"]) intValue];

                categoryobject.ShortString =[category objectForKey:@"ShortString"];

                categoryobject.Description =[category objectForKey:@"Description"];

                [Categories addObject:categoryobject];

                NSLog(@"The Results %@",Categories);

            }
 

но он разбился на:

            categoryobject.Id = [((NSNumber *)[category objectForKey:@"Id"]) intValue];
 

с ошибкой

 2014-06-26 01:46:39.050 xxxxx[4492:30f] -[__NSCFString objectForKey:]: unrecognized selector sent to instance 0x8fddfd0
2014-06-26 01:46:39.052 xxxxx[4492:30f] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString objectForKey:]: unrecognized selector sent to instance 0x8fddfd0'
 

Есть идеи, как решить эту проблему и как преобразовать это NSMutableArrat в NSSet , чтобы использовать для захвата покупки в приложении?

Ответ №1:

У вас здесь есть несколько проблем, которые я вижу.

Похоже, что ваш JSON представляет собой массив на верхнем уровне, содержащий словари внутри него. Вы присваиваете его указателю словаря.

Попробуйте это:

 NSArray* json =[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:amp;jsonError];
 

Опубликованный вами JSON также выглядит искаженным, однако это может быть просто результатом того, что вы его регистрируете, поэтому я не могу точно сказать, что с ним что-то не так. Если то, что я опубликовал выше, не решает вашу проблему, вам следует опубликовать JSON где-нибудь в Интернете, где мы можем увидеть его в формате raw, как вы делаете, когда используете его в своем запросе.

Другая проблема, которую я вижу, которая не является причиной вашей ошибки, заключается в том, что вы пытаетесь захватить объект (an NSNumber ) и привести его к примитивному типу ( int ), который не будет работать.

Вместо этого вам нужно будет использовать intValue метод NSNumber . Это выглядело бы примерно так:

 categoryobject.Id = [((NSNumber *)[category objectForKey:@"Id"]) intValue];
 

Комментарии:

1. теперь он выходит из строя при получении objectofKEy из категории

2. Я думаю, вам нужно будет предоставить свой необработанный JSON, как я сказал выше. С этим что-то не так. Ошибка говорит о том, что это строки, а не словари.

3. вы можете использовать эту ссылку для тестирования arabiceworld.com/ArabicEWorldWebService.svc/rest/Categories , Я подтверждаю это

4. И в этом ваша проблема. Совершенно очевидно, что JSON сформирован неправильно. Верхний уровень представляет собой массив, но все, что он содержит, — это строки. Строки выглядят как JSON, но на самом деле это просто строки (вы можете видеть, что они заключены в кавычки). Вам нужно исправить любой API, который вы используете, чтобы возвращать словари вместо строк в массиве.