1

NSOrderedSets を JSON にシリアライズおよびデシリアライズするためのオプションは何ですか? iOS5/Objective-C を使用しています。私は自分自身をロールバックできると思いますが、既存の優れたフレームワークがいくつかあると仮定しています...

4

2 に答える 2

3

setJSON にはデータ型がなく、順序付けられているため、次のように最初に変換してからシリアル化Arrayできます 。NSArray

NSOrderedSet *os = [NSOrderedSet orderedSetWithObjects:@"1", @"2", @"3", nil];
NSArray *jsonArr = [os array];
// JSON Data
NSData *json = [NSJSONSerialization dataWithJSONObject:jsonArr options:0 error:nil];
// JSON String representation
NSString *jsonString = [[NSString alloc] initWithData:json encoding:NSUTF8StringEncoding];
于 2012-05-08T09:55:44.153 に答える
0

おそらく唯一の選択肢は、OpenSource ライブラリにアクセスして、JSON シリアライザーがどのように実装されているかをコードで確認することです。次に、目的に合わせてライブラリを拡張できます。「拡張」とは、独自のシリアライザーをゼロから作成するのは大変な作業になる可能性があるため、既存のライブラリから可能な限り利用する必要があることを意味します。

通常、JSON ライブラリは、JSON 型と対応する Objective-C 型 (クラス) の間のマッピングを定義します。たとえば、JSON 配列は NSArray/NSMutableArray にマップされ、JSON オブジェクトは NSDictionary/NSMutableDictionary にマップされます。

したがって、「JSON シリアライザー」は、「マップされた」Objective-C オブジェクトを JSON 要素にシリアライズする方法を「認識」します。この動作を実装する 1 つの方法は、マップされた Objective-C クラスにカテゴリを追加することです。

そのため、「ライブラリを拡張する」場合 (ライブラリと実装によって異なります)、カスタム クラスのカテゴリを追加し、それに応じて実装するだけで十分な場合があります。

私は JSON ライブラリの作成者です。JSON シリアライザーで使用できるカスタム クラスのカテゴリを作成することは、それほど手間がかかりません。拡張リクエストでニーズを指定することもできるので、ライブラリを調整して、カスタム クラスをより簡単に追加できるようにすることもできます。

カテゴリは次のようになります。

@interface NSOrderedSet (JPJsonWriter) <JPJsonWriterInserterProtocol>
@end

@implementation NSOrderedSet (JPJsonWriter)

- (int) JPJsonWriter_insertIntoBuffer:(NSMutableDataPushbackBuffer*)buffer 
                             encoding:(JPUnicodeEncoding)encoding
                              options:(JPJsonWriterOptions)options
                                level:(NSUInteger)level
{
    return insertJsonArray(self, buffer, encoding, options, level);
}

@end

私のライブラリにいくつかの調整を加えた後、これは実際にあなたがしなければならないことのすべてです。ただし、注意してください: これは、使用している JSON ライブラリに依存します。私の JSON ライブラリはhereにあります。機能強化リクエストを提出してください - ありがとうございます。

于 2012-05-19T06:18:41.467 に答える