#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, который вы используете, чтобы возвращать словари вместо строк в массиве.