10

NSObject クラスに基づいてネストされた JSON をシリアル化する方法を知っている人はいますか? 単純な JSON をシリアル化するための議論がここにありますが、複雑なネストされた JSON に対応するには一般的ではありません。

これが JSON の結果であると想像してください。

{ "accounting" : [{ "firstName" : "John",  
                    "lastName"  : "Doe",
                    "age"       : 23 },

                  { "firstName" : "Mary",  
                    "lastName"  : "Smith",
                    "age"       : 32 }
                              ],                            
  "sales"      : [{ "firstName" : "Sally", 
                    "lastName"  : "Green",
                    "age"       : 27 },

                  { "firstName" : "Jim",   
                    "lastName"  : "Galley",
                    "age"       : 41 }
                  ]}

このクラスから:

@interface Person : NSObject{}
@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, strong) NSString *lastName;
@property (nonatomic, strong) NSNumber *age;
@end

@interface Department : NSObject{}
@property (nonatomic, strong) NSMutableArray *accounting; //contain Person class
@property (nonatomic, strong) NSMutableArray *sales; //contain Person class
@end

クラスに基づいて一般的にシリアル化/逆シリアル化する方法は?

編集

現在、私は任意のクラスに基づいてこのようなペイロードを生成できます:

NSMutableDictionary *Payload = [self serialize:objClass];

ただし、ネストされた複雑な JSON には対応していません。誰にもこれに対するより良い解決策がありますか? この C# ライブラリは、オブジェクト クラスに基づいてシリアライズ/デシリアライズを実行します。NSObjectに基づいて同じものを再現したい

4

3 に答える 3

12

最後に、 JSONModelを使用してこの問題を簡単に解決できます。これは、これまでのところ最良の方法です。JSONModel は、クラスに基づいてオブジェクトを一般的にシリアライズ/デシリアライズするライブラリです。intshortおよびのようなプロパティに非 nsobject ベースを使用することもできますfloat。また、ネストされた複雑な JSON にも対応できます。

1) 例を逆シリアル化します。上記の例を参照すると、ヘッダー ファイルで次のようになります。

#import "JSONModel.h"

@interface Person : JSONModel 
@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, strong) NSString *lastName;
@property (nonatomic, strong) NSNumber *age;
@end

@protocol Person;

@interface Department : JSONModel
@property (nonatomic, strong) NSMutableArray<Person> *accounting;
@property (nonatomic, strong) NSMutableArray<Person> *sales;
@end

実装ファイル:

#import "JSONModelLib.h"
#import "myJSONClass.h"

NSString *responseJSON = /*from example*/;
Department *department = [[Department alloc] initWithString:responseJSON error:&err];
if (!err)
{
    for (Person *person in department.accounting) {

        NSLog(@"%@", person.firstName);
        NSLog(@"%@", person.lastName);
        NSLog(@"%@", person.age);         
    }

    for (Person *person in department.sales) {

        NSLog(@"%@", person.firstName);
        NSLog(@"%@", person.lastName);
        NSLog(@"%@", person.age);         
    }
}

2) 例をシリアル化します。実装ファイル:

#import "JSONModelLib.h"
#import "myJSONClass.h"

Department *department = [[Department alloc] init];

Person *personAcc1 = [[Person alloc] init];
personAcc1.firstName = @"Uee";
personAcc1.lastName = @"Bae";
personAcc1.age = [NSNumber numberWithInt:22];
[department.accounting addOject:personAcc1];

Person *personSales1 = [[Person alloc] init];
personSales1.firstName = @"Sara";
personSales1.lastName = @"Jung";
personSales1.age = [NSNumber numberWithInt:20];
[department.sales addOject:personSales1];

NSLog(@"%@", [department toJSONString]);

そして、これは Serialize の例からの NSLog の結果です:

{ "accounting" : [{ "firstName" : "Uee",  
                    "lastName"  : "Bae",
                    "age"       : 22 }
                 ],                            
  "sales"      : [{ "firstName" : "Sara", 
                    "lastName"  : "Jung",
                    "age"       : 20 }
                  ]}
于 2013-05-27T10:53:35.550 に答える
1

逆シリアル化するオブジェクトの種類を事前に知っておく必要があります。この場合、NSDictionary「accounting」と「sales」の 2 つのプロパティを持つ に逆シリアル化します。これらの各プロパティは のインスタンスになりますNSArray。配列には のインスタンスがありますNSDictionary

これらの各オブジェクトが実際に何であるかを知っているので、JSON をネイティブ オブジェクトに逆シリアル化すると、逆シリアル化されたオブジェクトからクラスの新しいインスタンスを作成できます。例えば:

JSONDecoder decoder = [[JSONDecoder alloc] init];
NSObject notJSON = [decoder objectWithData:jsonData];
// where jsonData is an NSData representation of your JSON
[decoder release];

Person person1 = (Person)[notJSON objectForKey:@"accounting"][0];

この例を考えると、より一般的なデシリアライザーを推定できるはずです。つまり、データをループして、「不明な」汎用オブジェクトの「既知の」特定オブジェクトへのディープ コピーを作成する必要があります。

于 2013-02-19T13:47:17.247 に答える
0

多分これはBWJSONMatcherを助けることができます。1 行のコードで、JSON 文字列または JSON オブジェクトをデータ モデルと簡単に一致させることができます。

...
NSString *jsonString = @"{your-json-string}";
YourValueObject *dataModel = [YourValueObject fromJSONString:jsonString];

NSDictionary *jsonObject = @{your-json-object};
YourValueObject *dataModel = [YourValueObject fromJSONObject:jsonObject];
...
YourValueObject *dataModel = instance-of-your-value-object;
NSString *jsonString = [dataModel toJSONString];
NSDictionary *jsonObject = [dataModel toJSONObject];
...
于 2015-10-29T03:50:34.567 に答える