0

我正在尝试解析NSArrayJSON但出现以下错误:

* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM JSONRepresentation]: unrecognized selector sent to instance 0xa93e460' * First throw call stack: (0x21f1012 0x1feae7e 0x227c4bd 0x21e0bbc 0x21e094e 0x3445a 0x33ecc 0x26a453f 0x26b6014 0x26a72e8 0x26a7450 0x95e22e12 0x95e0acca) libc+ +abi.dylib: 终止调用抛出异常

我已经包含了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];

但我的数组包含对象列表(人)可能有问题。

我使用 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

项目.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



更新

学生示例
我尝试制作一个单独的项目。我从 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”

4

4 回答 4

0

查看以下摘自iOS 5 教程中使用 JSON 的 摘录 这主要用于生成 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 并检查问题是否仍然存在。

于 2012-11-07T08:58:36.183 回答
0

SBJson 不支持在没有帮助的情况下序列化用户定义的类。但是,如果您-proxyForJson在 Person 类中实现一个方法(例如这里),它应该可以工作。

如果您使用的是最近的 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 解析器。

于 2012-11-03T16:30:58.637 回答
0

您是否正确链接了类别?对我来说,您似乎缺少一个类别

于 2012-11-09T22:00:46.363 回答
0

我建议阅读该线程的前两条评论。如果这些都没有帮助,那么您仍然很可能没有正确安装库。尝试从您的项目中删除 SBJSON 文件,然后读取它们,确保将它们添加到您的目标中。此外,请确保您将 SBJSON 标头导入到您的类中。

我建议您尝试在 NSString 对象数组上使用 JSONRepresentation。如果框架安装正确,这肯定可以工作。通过这种方式,您可以缩小是安装问题还是自定义类的问题。

于 2012-11-05T15:54:03.737 回答