SBJSON编码包含另一个Object数组的Object

时间:2012-05-15 15:57:08

标签: objective-c ios json sbjson

我有一点json编码问题:

我需要使用SBJSON编码对象格式JSON,然后再将其发送到php服务器 目前这个示例代码工作:

NSArray *arrayData = [NSArray arrayWithObjects:
                      user.id == nil ? [NSNumber numberWithInt:-1] : user.id,
                      ProfessionField.text, NameField.text, RPPSField.text, RPPSField.text,
                      NameField.text, SurnameField.text, StreetField.text,
                      TownField.text, CpField.text, MailField.text,
                      PhoneField.text, FaxField.text, MobileField.text,
                   //   [user.horaires JSONRepresentation],
                      nil];

NSArray *arrayKey = [NSArray arrayWithObjects:
                     @"id", @"spe", @"name", @"rpps", @"cip",
                     @"name", @"surname", @"rue",
                     @"ville", @"cp", @"mail", 
                     @"tel", @"fax", @"port", 
                    // @"horaires",
                     nil];

NSDictionary *dataBrut = [NSDictionary dictionaryWithObjects:arrayData forKeys:arrayKey];
NSDictionary *jsonDict = [NSDictionary dictionaryWithObject:dataBrut forKey:@"data"];
NSString *jsonRequest = [jsonDict JSONRepresentation];

问题是当我需要发送“user.horaires”时(在评论中) 在此对象的JSON表示中应用CRASH。

此对象是以下类的数组:

@interface Horaire : NSObject
{ 
    BOOL morning;
}

@property (nonatomic, strong) NSNumber  *id;
@property (nonatomic, strong) NSString  *open;
@property (nonatomic, strong) NSString  *close;

有人知道如何成功编码吗?

1 个答案:

答案 0 :(得分:1)

您不应将JSON表示包含为JSON项。 JSON没有很好地“转义”字符串数据,因此嵌入式JSON(除非你单独“转义”它)将导致解析扼流。

相反,您应该在显示生成和插入的表示的位置放置用于生成JSON表示的字典或数组(即“user.horaires”本身)。然后整个结构将在一次操作中进行JSON编码。

即:

NSArray *arrayData = [NSArray arrayWithObjects:
                  user.id == nil ? [NSNumber numberWithInt:-1] : user.id,
                  ProfessionField.text, NameField.text, RPPSField.text, RPPSField.text,
                  NameField.text, SurnameField.text, StreetField.text,
                  TownField.text, CpField.text, MailField.text,
                  PhoneField.text, FaxField.text, MobileField.text,
                  user.horaires,
                  nil];