コード内:
+ (NSString *)JSONString;
(+
プラス記号) は、クラス メソッドを示します。おそらく次のようなインスタンス メソッドが必要です。
- (NSString *)JSONString;
シリアライゼーションの実装方法について:これはかなりの「余談」です。あなたが求めていることの範囲は非常に広く、具体的なことはほとんどありません。これは実際には、ニーズの範囲と投資したい時間/エネルギーの関数ですが、意見を検討する必要があります。
上のカテゴリNSObject
は少し広すぎるように思えます。より論理的な選択であるプロトコルよりも良い結果が得られる可能性は低いと思います.
率直に言っNSJSONSerialization
て、独自のカスタム モデル オブジェクトをシリアル化するためのプロトコルを宣言しておけばよかったと思いますNSCoding
。これは、オブジェクトを にエンコードするときに私が行く一般的なルートJSON
です。プロトコルは次のようになります。
NSString * const MySerializationClassKey = @"MySerializationClassKey";
@protocol MySerializationProtocol <NSObject>
@required
-(NSDictionary *)dictionarySerialization;
-(id)initFromDictionarySerialization:(NSDictionary *)dictionary;
@end
そして、カスタムモデルオブジェクトは次のようにシリアル化および逆シリアル化できます:(非常に単純化されています)
@interface MyModel() <MySerializationProtocol>
@property (strong) NSString *name;
@end
@implementation MyModel
NSString * const MyModelNameKey = @"MyModelNameKey";
@synthesize name = _name;
-(NSDictionary *)dictionarySerialization{
// encode object as dictionary
return @{MySerializationClassKey: NSStringFromClass(self.class), MyModelNameKey: _name.copy};
}
-(id)initFromDictionarySerialization:(NSDictionary *)dictionary{
if ((self = [super init])){
_name = [dictionary objectForKey:MyModelNameKey];
}
return self;
}
@end
NSArray
ここで、完全なシリアル化ライブラリを回答に入力しないために、これらのモデル オブジェクトのフラットしかなかったとします。NSJSONSerialization
これらのメソッドと連携して使用するクラスを作成できます。各呼び出しを簡単にするには、次のようにします。
@interface MySerializer : NSObject
@end
@implementation MySerializer
+(NSData *)jsonDataFromObject:(NSMutableArray *)array{
for (NSUInteger index = 0; index < array.count; index++) {
NSObject *object = [array objectAtIndex:index];
if ([object conformsToProtocol:@protocol(MySerializationProtocol)]){
NSDictionary *dictRep = [(id<MySerializationProtocol>)object dictionarySerialization];
[array replaceObjectAtIndex:index withObject:dictRep];
}
}
return [NSJSONSerialization dataWithJSONObject:array options:0 error:nil];
}
+(NSMutableArray *)objectFromJSONData:(NSData *)data{
NSMutableArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
for (NSUInteger index = 0; index < array.count; index++) {
NSObject *object = [array objectAtIndex:index];
if ([object isKindOfClass:[NSDictionary class]]){
NSDictionary *dict = (NSDictionary *)object;
NSString *className = [dict objectForKey:MySerializationClassKey];
if (className.length > 0) {
NSObject *deserialized = [[NSClassFromString(className) alloc] initFromDictionarySerialization:dict];
if (deserialized) [array replaceObjectAtIndex:index withObject:deserialized];
}
}
}
return array;
}
@end
明らかに、このようなコードからマイレージを取得するには、可能な配列と辞書を再帰的にトラバースする必要があります。しかし、これは私の好みのルートです。