[英]Serialize custom object to JSON which contains NSMutableArray
我正在尝试序列化我的Cart对象,该对象中包含项的NSMutableArray
,但得到:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (Item)'
如果我了解这应该如何工作,那么我需要创建一个字典数组以使NSJSONSerialization
正确工作。 那不是我在下面做什么吗?
我的购物车:
@interface Cart : BaseObject
@property (nonatomic, strong) NSString *comp;
@property (nonatomic, strong) NSString *sono;
@property (nonatomic, strong) NSString *cust;
@property (nonatomic, strong) NSString *scus;
@property (nonatomic, strong) NSString *cnid;
@property (nonatomic, strong) NSString *dldt;
@property (nonatomic, strong) NSString *whse;
@property (nonatomic, strong) NSString *pono;
@property (nonatomic, strong) NSString *pon2;
@property (nonatomic, strong) NSString *emad;
@property (nonatomic, strong) NSString *pkin;
@property (nonatomic, strong) NSString *comt;
@property (nonatomic, strong) NSString *rtin;
@property (nonatomic, strong) NSString *lbfg;
@property (nonatomic, strong) NSString *containsOpenPriced;
@property (nonatomic, strong) NSString *totalProductAmount;
@property (nonatomic, strong) NSMutableArray *items;
@property (nonatomic) BOOL *isSubmitting;
@end
我的购物车:
@implementation Cart
@synthesize comp;
@synthesize sono;
@synthesize cust;
@synthesize scus;
@synthesize cnid;
@synthesize dldt;
@synthesize whse;
@synthesize pono;
@synthesize pon2;
@synthesize emad;
@synthesize pkin;
@synthesize comt;
@synthesize rtin;
@synthesize lbfg;
@synthesize containsOpenPriced;
@synthesize totalProductAmount;
@synthesize items;
- (id) initWithDictionary:(NSDictionary *)dictionary {
self = [super init];
if (self) {
self.comp = dictionary[@"comp"];
self.sono = dictionary[@"sono"];
self.cust = dictionary[@"cust"];
self.scus = dictionary[@"scus"];
self.cnid = dictionary[@"cnid"];
self.dldt = dictionary[@"dldt"];
self.whse = dictionary[@"whse"];
self.pono = dictionary[@"pono"];
self.pon2 = dictionary[@"pon2"];
self.emad = dictionary[@"emad"];
self.pkin = dictionary[@"pkin"];
self.comt = dictionary[@"comt"];
self.rtin = dictionary[@"rtin"];
self.lbfg = dictionary[@"lbfg"];
self.containsOpenPriced = dictionary[@"containsOpenPriced"];
self.totalProductAmount = dictionary[@"totalProductAmount"];
NSArray *itemsArray = dictionary[@"items"];
NSMutableArray *itemsMutableArray = [[NSMutableArray alloc]init];
for (NSDictionary *itemDictionary in itemsArray) {
Item *item = [[Item alloc] initWithDictionary:itemDictionary];
[itemsMutableArray addObject:item];
}
self.items = itemsMutableArray;
}
return self;
}
@end
我的序列化对象的代码:
NSMutableArray *itemsToSerialize = [[NSMutableArray alloc] init];
for (Item *item in cart.items) {
NSMutableDictionary *itemDict = [[NSMutableDictionary alloc] init];
[itemDict setObject:item forKey:@"item"];
[itemsToSerialize addObject:item];
}
NSMutableDictionary *data = [@{
@"comp" : cart.comp,
@"rtin" : cart.rtin,
@"pono" : cart.pono,
@"pon2" : cart.pon2,
@"totalProductAmount" : totalProductAmount,
@"sono" : cart.sono,
@"emad" : cart.emad,
@"lbfg" : lbfg,
@"pkin" : cart.pkin,
@"containsOpenPriced" : containsOpenPriced,
@"cnid" : cart.cnid,
@"whse" : cart.whse,
@"scus" : cart.scus,
@"dldt" : cart.dldt,
@"cust" : cart.cust,
@"comt" : cart.comt,
@"items": itemsToSerialize
} mutableCopy];
NSString *command = @"shoppingCart.update";
NSMutableDictionary *request = [@{
@"command" : command,
@"comp" : cart.comp,
@"cnid" : sessionController.operator.cnid,
@"cust" : cart.cust,
@"data" : data
} mutableCopy];
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:request options:kNilOptions error:nil];
死于上述NSJSONSerialization
行。 我想念什么?
这行: [itemsToSerialize addObject:item];
应该是[itemsToSerialize addObject:itemDict];
。 结果是您要尝试序列化项本身的数组,从而产生您所看到的异常。
NSJSONSerialization仅适用于数组( NSArray
或NSMutableArray
),字典( NSDictionary
或NSMutableDictionary
,字符串( NSString
或NSMutableString
)和NSNumber
。
常见的机制是在您的类上创建- (NSDictionary *)serialize
方法,该方法将其所有值复制到字典中以传递到NSJSONSerialization中。 然后实现- (id)initFromSerialization:(NSDictionary *)serialization
以反- (id)initFromSerialization:(NSDictionary *)serialization
对象。
我知道这有点晚了,但也许该类可以简化您的编码:
它是将Custom NSObject转换为JSON可读对象(NSArray或NSDictionary)的类。 试试看。 它具有跳过属性和将属性类型从字符串更改为NSInteger或Float的功能,还可以更改最终输出属性名称,例如
CustomObject *X;
X.property1 = @"Test";
//and the output JSON readable format you want tot change X to Y
//CustomObject converted to readable format
{Y = @"Test"}
这是反汇编程序类
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.