2

我有一个如下所示的类列表:

@interface AISlideItem: NSObject
{
    NSString*  PlaceHolderName;
    NSUInteger PlaceHolderID;
}
@property (nonatomic, strong) NSString* PlaceHolderName;
@property (nonatomic) NSUInteger PlaceHolderID;

@end

@interface AITitleSlideItem : AISlideItem
{
    NSString* Title;
}
@property (nonatomic, strong) NSString* Title;
@end

@interface AIParagraphSlideItem : AISlideItem
{
    NSMutableArray* Paragraphs;
}
@property (nonatomic, strong) NSMutableArray* Paragraphs;
@end

@interface AITextSlideItem : AISlideItem
{
    NSString* Text;
}
@property (nonatomic, strong) NSString* Text;
@end

@interface AIPictureSlideItem : AISlideItem
{
    NSMutableData* Picture;
}
@property (nonatomic, strong) NSMutableData* Picture;
@end

@interface AISlideContent : NSObject
{
    NSString*       LayoutName;
    NSMutableArray* Items;
}
@property (nonatomic,strong) NSString* LayoutName;
@property (nonatomic,strong) NSMutableArray* Items;
@end

@interface ContentParaghraph : NSObject
{
    NSInteger Level;
    NSString* Text;
}
@property (nonatomic) NSInteger Level;
@property (nonatomic, strong) NSString* Text;
@end

我想将一个包含 AISlideContent 对象的 NSMutableArray 序列化为 json。json 中的每个项目的名称都应该与变量的名称相同。

我怎样才能做到这一点?

这是一个示例 JSON:

{
  d: [
     {
          Items: [
          {
              placeHolderName: "1",
              Title: "Title Slide"
          },
          {
              placeHolderName: "2",
              Paragraphs: [
                 {
                     Level: 0,
                     Text: "Title content"
                 }
              ]
          }
       ],
       LayoutName: "Title"
     },
     {
         Items: [
         {
              placeHolderName: "1",
              Title: "Slide 2"
     },
     {
              placeHolderName: "2",
              Paragraphs: [
              {
                 Level: 0,
                 Text: "Line 1"
              },
              {
                 Level: 0,
                 Text: "Line 2"
              },
              {
                 Level: 1,
                 Text: "Line 2 indented"
              },
              {
                 Level: 2,
                 Text: "Line 3 more indented"
              },
              {
                 Level: 0,
                 Text: "Line 4"
              }
              ]
     }
      ],
      LayoutName: "Title and Content"
     },
     {
           Items: [
           {
                placeHolderName: "1",
                Title: "Slide 3"
           },
           {
                placeHolderName: "3",
                Picture: [

                ]
           }
       ],
       LayoutName: "Picture above Caption"
      }
      ]
}

ps 我启用了 ARC

4

2 回答 2

2

您必须遵循NSCoding协议并覆盖encodeObjectdecodeObject方法。

是一个示例。

于 2012-06-01T09:50:06.433 回答
1

Objective-C JSON 库定义了 Objective-C 类和相应 JSON 元素之间的映射。例如,一个 NSArray 将被映射到一个 JSON 数组,一个 NSDictionary 将被映射到一个 JSON 对象,一个 NSString 到一个 JSON 字符串等等。

JSON 序列化器的实现将遍历对象层次结构并使用自省来确定 Objective-C 类类型,或者在内部为那些可以序列化的 Objective-C 类实现 Category,然后按顺序调用/调用适当的序列化方法将字符写入流。

现在,拥有一个包含具有任意类的对象的对象层次结构并尝试运行序列化程序可能会失败,因为它不知道如何序列化 NSDate 例如。

此问题的一个可能解决方案是查看您正在使用的 JSON 库的文档,并确定是否以及如何实现这一点。AFAIK,Cocoa 的内置 NSJSONSerialization 不能做到这一点。

最近的JSONKit可能对你有用,它使用回调机制。不过,我并没有深入研究它。

另一方面, JPJson 库使用 Category 方法。您只需为您的自定义类分别定义一个类别,即您想要序列化(例如 NSDate)并实现协议的内置 Cocoa 类。一旦实现(这在 JPJson 中很容易),即使在深度嵌套的层次结构中,此类的对象也将被正确序列化,并维护其他序列化选项 - 如“漂亮打印”、Unicode 编码、字符串转义等。

查看您的示例,使用 JPJson 似乎很容易实现。JPJson 包在 GitHub 上,还有一个示例,展示了如何序列化这些自定义类。

您可以查看https://github.com/couchdeveloper/JPJson,尤其是 Sample6。

于 2012-06-06T21:42:23.987 回答