我正在尝试为我的应用解析一些JSON。
在尝试设置“名称”值时,我收到错误unrecognized selector sent to instance'
这是错误发生的代码行:self.name = [json_object objectForKey:@"name"];
(json_object是一个NSDictionary,“self”是CoreData中的一个对象)
我的JSON看起来像这样:
json_object: {
draftstatus = "isdraftfull.php";
getcard = "getcard.php";
getpack = "getpack.php";
imageextension = ".jpg";
images = "images/small/";
joindraft = "joindraft.php";
joindraftmenu = "getjoindraftmenu.php";
login = "loginasuser.php";
name = "the server";
passpack = "passpack.php";
playerdraftstatus = "getplayerdraftstatus.php";
signup = "signup.php";
userexists = "checkifuserexists.php";
usesetidforimagepath = false;
}
Server.h看起来像这样:
#import <CoreData/CoreData.h>
#import "JSON.h"
@interface Server : NSManagedObject
{
NSMutableData *responseData;
}
@property (nonatomic, retain) NSString * playerdraftstatus;
@property (nonatomic, retain) NSString * signup;
@property (nonatomic, retain) NSNumber * usesetidforimagepath;
@property (nonatomic, retain) NSString * login;
@property (nonatomic, retain) NSString * imageextension;
@property (nonatomic, retain) NSString * userexists;
@property (nonatomic, retain) NSString * getcard;
@property (nonatomic, retain) NSString * passpack;
@property (nonatomic, retain) NSString * draftstatus;
@property (nonatomic, retain) NSString * joindraftmenu;
@property (nonatomic, retain) NSString * getpack;
@property (nonatomic, retain) NSString * joindraft;
@property (nonatomic, retain) NSString * images;
@property (nonatomic, retain) NSNumber * isdefaultserver;
@property (nonatomic, retain) NSString * root;
@property (nonatomic, retain) NSString * name;
- (id) initWithWebAddress:(NSString *) address;
- (id) initWithWebAddressAsyn:(NSString *) address;
- (void) fillFromJSON:(NSDictionary *) json_object;
- (void) saveServer;
@end
我相信它几天前工作了,但我不记得了。当我今天开始研究它时,我添加了“根”对象。它编译时没有错误,但不会解析json。
帮助?
修改
我更改了JSON以使用name = "the server"
返回,当我按此NSLog(@"json_object name: %@", [json_object objectForKey:@"name"]);
记录时,日志显示为json_object name: the server
,但当我尝试将其设置为{{1}时仍然会出现相同的错误其类型为String。
我注意到有时在检查JSON的日志版本时,名称中的值并不总是用引号括起来,正如您从self.name
的日志中看到的那样,它显示时没有引号。这是问题,为什么会发生这种情况?如果我直接在输出它的网页上查看json,那么值总是会引用。
编辑2
完整错误如下:
[json_object objectForKey:@"name"]
编辑3
我在“自我”上做了一个NSLog,这就是-[Server setName:]: unrecognized selector sent to instance 0x61036e0
2010-11-19 15:46:10.113 TCGDraft[57953:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Server setName:]: unrecognized selector sent to instance 0x61036e0'
*** Call stack at first throw:
的回复
我不知道这是不正常的。这是一个CoreData对象,我有一种感觉,我可能会以某种方式弄乱它。
编辑4
我回过头来看看代码,从CoreData创建一个服务器对象,如下所示:
self: <Server: 0x6143190> (entity (null); id: (null) ; data: {})
当我跑步时,我现在得到一个错误,只是说Server *server = [NSEntityDescription
insertNewObjectForEntityForName:@"Server"
inManagedObjectContext:context];
所以看起来好像是某个对象搞砸了......但我不知道怎么做。
编辑5
是的,所以我用我的自定义代码完全删除了Server.h和Server.m文件,我从CoreData对象重新创建了它们并尝试了我在“编辑4”中发布的代码,我仍然得到关于EXC_BAD_ACCESS的相同错误...现在我显然已经退步而不是前进。
答案 0 :(得分:3)
首先,我建议您完全将NSManagedObject与JSON解析器方法分开。所有异步加载和处理JSON数据都应该在一个单独的对象中处理,然后您可以将该对象分配给托管对象属性。
#import <CoreData/CoreData.h>
@interface Server : NSManagedObject
{
}
@property (nonatomic, retain) NSString * playerdraftstatus;
@property (nonatomic, retain) NSString * signup;
...
@property (nonatomic, retain) NSString * name;
@end
其次,请勿将@dynamic值更改回@synthesize,否则CoreData将无法为您操作和保存这些对象(这很可能是您在尝试保存对象时获得EXEC_BAD_ACCESS异常的原因!)
@dynamic *playerdraftstatus;
@dynamic *signup;
...
@dynamic *name;
现在尝试从创建Server对象的控制器中分配属性值,即
Server *server = [NSEntityDescription
insertNewObjectForEntityForName:@"Server"
inManagedObjectContext:context];
server.name = [json_object valueForKey:@"name"];
最后,请确保您不会释放服务器对象,因为CoreData会自动为您提供此服务。
PS:如果您更改了数据模型,则可能需要从iPhone /模拟器重置/删除应用程序,否则您将收到一条错误消息,指出商店类型与手机上的现有类型不兼容。
如果您收到任何进一步的错误消息,请告诉我。
干杯,
罗格
答案 1 :(得分:0)
问题是您的Server类中没有setName方法。它与json数据无关。确保合成属性,或者定义必要的方法。