2

JSONにシリアル化してサービスに投稿したい一連のNSObjectがあります。最終的なオブジェクトは、相互にネストされたこれらのNSObjectサブクラスのいくつかのレベルで構成されます。

これらのオブジェクトはそれぞれ、適切なキーを使用してNSDictionary内のオブジェクトのプロパティを返すメソッドを持つプロトコルに従います。ただし、これらのプロパティの一部は他のオブジェクトなどであるため、シリアル化は少し複雑になります。

最終的なオブジェクトのシリアル化を簡素化するために使用できるパターンはありますか?JSONKitを使用すると、各辞書を最も深いオブジェクトから個別にシリアル化し、逆方向に作業してエラーをチェックしてから、複合文字列に追加する必要があるようです。私は、これがこの非常に有能なライブラリを使用する最良の方法ではない可能性があることを知っています。任意の提案やガイダンスを歓迎します。

編集1

JSONKit GitHub URL

JSONKitReadmeドキュメント

4

3 に答える 3

8

AutomagicCodingライブラリは、低レベルのプロパティイントロスペクションを使用して、NSObjectをNSDictionaryに再帰的に変換します。これにより、JSONとして直接シリアル化できます。

https://github.com/psineur/NSObject-AutomagicCoding

構造体などのプロパティを持つクラスを少し微調整する必要があるかもしれませんが、おそらく最も簡単で、労働集約的でないアプローチです。

アップデート:

それ以来、NSCodingプロトコルを使用して任意のオブジェクトをJSONとしてロード/保存できる独自のライブラリHRCoding(https://github.com/nicklockwood/HRCoder )を作成しました)

于 2012-02-08T17:34:41.680 に答える
2

これで、 JSONModelを使用してこの問題を簡単に解決できます。JSONModelは、クラスに基づいてオブジェクトを一般的にシリアル化/逆シリアル化するライブラリです。、、などintのプロパティに基づいた非nsobjectを使用することもできます。ネストされた複雑なJSONにも対応できます。エラーチェックを処理します。shortfloat

このJSONを考えると{"firstname":"Jenson","surname":"Button"}

を逆シリアル化します。ヘッダーファイル内:

#import "JSONModel.h"

@interface Person : JSONModel 
@property (nonatomic, strong) NSString* firstname;
@property (nonatomic, strong) NSString* surname;
@end

実装ファイル内:

#import "JSONModelLib.h"
#import "yourPersonClass.h"

NSString *responseJSON = /*from somewhere*/;
Person *person = [[Person alloc] initWithString:responseJSON error:&err];
if (!err)
{
   NSLog(@"%@  %@", person.firstname, person.surname):
}

シリアル化の例。実装ファイル:

#import "JSONModelLib.h"
#import "yourPersonClass.h"

Person *person = [[Person alloc] init];
person.firstname = @"Jenson";
person.surname = @"Uee";

NSLog(@"%@", [person toJSONString]);
于 2013-05-27T09:43:45.577 に答える
1

問題を理解できるかわかりません。あなたはパターンを求めますが、あなたは標準的なものを説明しているようです:

これらのオブジェクトはそれぞれ、適切なキーを使用してNSDictionary内のオブジェクトのプロパティを返すメソッドを持つプロトコルに従います。

メソッドがと呼ばれているとしましょうserializedDictionary。クラスにそれ自体が他のオブジェクトであるプロパティがある場合は、呼び出しserializedDictionaryて結果を作成しているディクショナリに追加するだけです。したがって、必要なのは、最上位オブジェクトにそのを要求しserializedDictionary、それをJSONに変換することだけです。

エラー処理が心配な場合は、メソッドの結果を確認して、呼び出し元にエラーを渡してください。これは、例外(記述するコードなし)または慣例により行うことができます。たとえば、エラー時にnilを返し、NSErrorインスタンスへのポインタを参照することもできます。次に、コンテナオブジェクトで次のようなことを行います。

- (NSDictionary *)serializedDictionaryWithError:(NSError **)error
{
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    [dict setObject:self.someProperty forKey:@"some-property"];
    NSDictionary *childDict = [self.childObject serializedDictionaryWithError:error];
    if (childDict == nil) return nil;
    [dict setObject:childDict forKey:@"child-object"];
    return dict;
}

バム!

于 2012-02-08T17:54:49.853 に答える