我正在尝试将NSArray
解析为JSON
,但我收到以下错误:
*由于未捕获的异常终止应用' NSInvalidArgumentException',原因:' - [__ NSArrayM JSONRepresentation]:无法识别的选择器发送到实例0xa93e460' * 第一次抛出调用堆栈:(0x21f1012 0x1feae7e 0x227c4bd 0x21e0bbc 0x21e094e 0x3445a 0x33ecc 0x26a453f 0x26b6014 0x26a72e8 0x26a7450 0x95e22e12 0x95e0acca)libc ++ abi.dylib:terminate叫做throw a 例外
我已经包含了 SBJson_3.1.1 / Classes 目录中的所有类 这是代码:
NSMutableArray* arr = ...get array
NSString* jsonArr = [arr JSONRepresentation]; // here I get error
当我在简单字符串数组中执行此操作时,它可以工作:
NSData *jsonData = [NSJSONSerialization arr
options:NSJSONWritingPrettyPrinted error:nil];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
但我的数组包含对象列表(Person)可能存在问题。
我使用Item而不是person作为例子
Item.h
@interface Item : NSObject
{
BOOL IsOpen;
NSString* Description;
}
@property int ItemId;
@property int SequenceId;
@property BOOL IsOpen;
@property NSString* Description;
- (id) proxyForJson;
@end
Item.m
@implementation Item
@synthesize ItemId;
@synthesize SequenceId;
@synthesize Description;
@synthesize IsOpen;
- (id) proxyForJson {
return [NSDictionary dictionaryWithObjectsAndKeys:
[NSString stringWithFormat:@"%i", ItemId], @"ItemId",
SequenceId, @"SequenceId",
Description, @"Description",
IsScanned, @"IsOpen",
nil ];
}
@end
UPDATE
学生例子
我试图做一个单独的项目。我从sbjson框架的classes目录复制到新项目。这是代码:
#import "SBJson.h"
@interface Student : NSObject
{
NSString *name;
NSInteger sid;
NSString *email;
}
@property NSString *name;
@property NSInteger sid;
@property NSString *email;
- (id) proxyForJson;
@end
@implementation Student
@synthesize name;
@synthesize sid;
@synthesize email;
- (id) proxyForJson{
return [NSDictionary dictionaryWithObjectsAndKeys:
name, @"student_name",
[NSNumber numberWithInt:sid], @"student_id",
email, @"email",
nil ];
}
@end
NSMutableArray* studentArray = [[NSMutableArray alloc]init];
Student* s1 = [[Student alloc]init];
s1.name = @"student 1";
s1.sid = 45;
s1.email = @"test@test.com";
Student* s2 = [[Student alloc]init];
s2.name = @"student 2";
s2.sid = 46;
s2.email = @"plavi@test.com";
[studentArray addObject:s1];
[studentArray addObject:s2];
NSString *jsonString = [studentArray JSONRepresentation];
NSLog(@"%@", jsonString);
我又得到了错误:
由于未捕获的异常而终止应用 ' NSInvalidArgumentException',原因:' - [__ NSArrayM JSONRepresentation]:无法识别的选择器发送到实例0x741b100'
答案 0 :(得分:0)
SBJson不支持在没有帮助的情况下序列化用户定义的类。如果在Person类中实现-proxyForJson
方法(例如here),它应该可以工作。
如果您使用的是最新的Xcode,则以下内容应该有效。部首:
@interface Item : NSObject
@property int ItemId;
@property int SequenceId;
@property BOOL IsOpen;
@property(copy) NSString* Description;
- (id) proxyForJson;
@end
实现:
@implementation Item
- (id) proxyForJson {
return @{ @"ItemId": @(self.ItemId),
@"SequenceId": @(self.SequenceId),
@"Description": self.Description,
@"IsOpen": @(self.IsOpen)
};
}
@end
这应该让SBJson将Item对象序列化为NSDictionaries。但是,SBJson 不支持将JSON解析为自定义对象。因此,您将始终以字典形式获取此信息。我不知道任何提供自定义类型绑定的Objective-C JSON解析器。
答案 1 :(得分:0)
我建议阅读this thread的前两条评论。如果这些没有帮助,您仍然很可能没有正确安装库。尝试从项目中删除SBJSON文件,然后读取它们,确保它们已添加到目标中。另外,请确保将SBJSON标头导入到您的班级中。
我建议您尝试在NSString对象数组上使用JSONRepresentation。如果框架已正确安装,这肯定会起作用。这样,您可以缩小是安装问题还是自定义类的问题。
答案 2 :(得分:0)
查看Working with JSON in iOS 5 Tutorial 的以下摘录 这主要用于生成JSON。
//build an info object and convert to json
NSDictionary* info = [NSDictionary dictionaryWithObjectsAndKeys:
[loan objectForKey:@"name"],
@"who",
[(NSDictionary*)[loan objectForKey:@"location"]
objectForKey:@"country"],
@"where",
[NSNumber numberWithFloat: outstandingAmount],
@"what",nil];
//convert object to data
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:info options:NSJSONWritingPrettyPrinted error:&error];
现在,区别在于使用NSDictionary并将其转换为JSON Data 。尝试以上面给出的方式形成JSON并检查问题是否仍然存在。
答案 3 :(得分:0)
您是否正确链接该类别?对我来说,有点像你错过了一个类别