“如何在 XCode 中使用 JSON 序列化 NSDictionary 中的自定义对象?”
找出我讨厌 XCode 的另一个原因,并希望有人能把它从 1990 年代拖出来。
让我们通过一个示例来说明我们期望如何序列化自定义对象。
假设您有一个非常简单的 UserRecord 类,其 .h 文件如下所示:
@interface UserRecord : NSObject
@property(nonatomic) int UserID;
@property(nonatomic, strong) NSString* FirstName;
@property(nonatomic, strong) NSString* LastName;
@property(nonatomic) int Age;
@end
像这样的 .m :
@implementation UserRecord
@synthesize UserID;
@synthesize FirstName;
@synthesize LastName;
@synthesize Age;
@end
如果您尝试创建一个 UserRecord 对象,并使用 NSJSONSerialization 类对其进行序列化..
UserRecord* sampleRecord = [[UserRecord alloc] init];
sampleRecord.UserID = 13;
sampleRecord.FirstName = @"Mike";
sampleRecord.LastName = @"Gledhill";
sampleRecord.Age = 82;
NSError* error = nil;
NSData* jsonData2 = [NSJSONSerialization dataWithJSONObject:sampleRecord options:NSJSONWritingPrettyPrinted error:&error];
..它会嘲笑你,抛出异常并使你的应用程序崩溃:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** +[NSJSONSerialization dataWithJSONObject:options:error:]: Invalid top-level type in JSON write'
解决这个闹剧的一种方法是向您添加一个函数,NSObject
将您的数据转换为NSDictionary
.,然后将其序列化。
这是我班级的新 .m 文件:
@implementation UserRecord
@synthesize UserID;
@synthesize FirstName;
@synthesize LastName;
@synthesize Age;
-(NSDictionary*)fetchInDictionaryForm
{
NSMutableDictionary* dict = [[NSMutableDictionary alloc] init];
[dict setObject:[NSNumber numberWithInt:UserID] forKey:@"UserID"];
[dict setObject:FirstName forKey:@"FirstName"];
[dict setObject:LastName forKey:@"LastName"];
[dict setObject:[NSNumber numberWithInt:Age] forKey:@"Age"];
return dict;
}
@end
实际上,NSDictionary
如果您想:
-(NSDictionary*)fetchInDictionaryForm
{
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:UserID], @"UserID",
FirstName, @"FirstName",
LastName,@"LastName",
[NSNumber numberWithInt:Age], @"Age",
nil];
return dict;
}
完成此操作后,您可以NSJSONSerialization
序列化NSDictionary
对象的版本:
UserRecord* sampleRecord = [[UserRecord alloc] init];
sampleRecord.UserID = 13;
sampleRecord.FirstName = @"Mike";
sampleRecord.LastName = @"Gledhill";
sampleRecord.Age = 82;
NSDictionary* dictionary = [sampleRecord fetchInDictionaryForm];
if ([NSJSONSerialization isValidJSONObject:dictionary])
{
NSError* error = nil;
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:&error];
NSString* jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"%@", jsonString);
}
这将产生我们想要的 JSON 输出:
{
"UserID" : 13,
"FirstName" : "Mike",
"LastName" : "Gledhill",
"Age" : 82
}
令人震惊。即使在 2015 年,Apple 的 SDK 也无法将一组简单的int
s 和NSString
s 序列化为 JSON。
希望这可以帮助其他 XCode 受害者。