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クラスのカテゴリを内部的に実装してから、適切なシリアル化メソッドを順番に呼び出し/呼び出します文字をストリームに書き込みます。

現在、任意のクラスを持つオブジェクトを含むオブジェクト階層を持ち、シリアライザーを実行しようとすると、たとえば NSDate をシリアライズする方法がわからないため、失敗する可能性があります。

この問題の可能な解決策は、使用している JSON ライブラリのドキュメントを見て、これを達成できるかどうか、およびその方法を理解することです。私の知る限り、ココアの組み込み NSJSONSerialization はこれを行うことができません。

コールバック メカニズムを使用する最近のJSONKitが機能する場合があります。とはいえ、あまり深く見ていませんでした。

一方、 JPJson ライブラリはカテゴリ アプローチを使用します。カスタムクラスのカテゴリを定義するだけで、シリアライズしたいビルトイン Cocoa クラス (NSDate など) とプロトコルを実装できます。このクラスのオブジェクトが実装されると (JPJson では非常に簡単です)、深くネストされた階層内でも正しくシリアル化され、他のシリアル化オプション (「プリティ プリンティング」、Unicode エンコーディング、文字列エスケープなど) が維持されます。

あなたの例を見ると、JPJsonで実装するのはとても簡単に思えます。JPJson パッケージは GitHub にあり、これらのカスタム クラスをシリアル化する方法を示すサンプルもあります。

https://github.com/couchdeveloper/JPJson、特に Sample6をご覧ください。

于 2012-06-06T21:42:23.987 に答える