私はjsonオブジェクトを持っています:
@interface Order : NSObject
@property (nonatomic, retain) NSString *OrderId;
@property (nonatomic, retain) NSString *Title;
@property (nonatomic, retain) NSString *Weight;
- (NSMutableDictionary *)toNSDictionary;
...
- (NSMutableDictionary *)toNSDictionary
{
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
[dictionary setValue:self.OrderId forKey:@"OrderId"];
[dictionary setValue:self.Title forKey:@"Title"];
[dictionary setValue:self.Weight forKey:@"Weight"];
return dictionary;
}
文字列では、これは次のとおりです。
{
"Title" : "test",
"Weight" : "32",
"OrderId" : "55"
}
コード付きの文字列JSONを取得します:
NSMutableDictionary* str = [o toNSDictionary];
NSError *writeError = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:str options:NSJSONWritingPrettyPrinted error:&writeError];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
今私はする必要がありますJSON文字列からオブジェクトを作成してマッピングする:
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *e;
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:jsonData options:nil error:&e];
これにより、満たされたNSDictionaryが返されます。この辞書からオブジェクトを取得するにはどうすればよいですか?
新しいinitWithDictionary:
メソッドをOrder
に追加します。
- (instancetype)initWithDictionary:(NSDictionary*)dictionary {
if (self = [super init]) {
self.OrderId = dictionary[@"OrderId"];
self.Title = dictionary[@"Title"];
self.Weight = dictionary[@"Weight"];
}
return self;
}
initWithDictionary
の署名をOrder.h
ファイルに追加することを忘れないでください
JSONを取得する方法では:
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *e;
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:jsonData options:nil error:&e];
Order *order = [[Order alloc] initWithDictionary:dict];
オブジェクトのプロパティ名がJSON文字列のキーと一致する場合は、次の操作を実行できます。
JSON文字列をオブジェクトにマップするには、最初に文字列をNSDictionaryに変換する必要があります。次に、キー値コーディングを使用して各プロパティを設定するNSObjectのメソッドを使用できます。
NSError *error = nil;
NSData *jsonData = ...; // e.g. [myJSONString dataUsingEncoding:NSUTF8Encoding];
NSDictionary *jsonDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingOptionsAllowFragments error:&error];
MyObject *object = [[MyObject alloc] init];
[object setValuesForKeysWithDictionary:jsonDictionary];
キーが一致しない場合は、オブジェクトクラスのNSObject -[NSObject valueForUndefinedKey:]
のインスタンスメソッドをオーバーライドできます。
オブジェクトをJSONにマッピングするには、Objective-Cランタイムを使用して自動的にマッピングします。以下は、任意のNSObjectサブクラスで機能します。
#import <objc/runtime.h>
- (NSDictionary *)dictionaryValue
{
NSMutableArray *propertyKeys = [NSMutableArray array];
Class currentClass = self.class;
while ([currentClass superclass]) { // avoid printing NSObject's attributes
unsigned int outCount, i;
objc_property_t *properties = class_copyPropertyList(currentClass, &outCount);
for (i = 0; i < outCount; i++) {
objc_property_t property = properties[i];
const char *propName = property_getName(property);
if (propName) {
NSString *propertyName = [NSString stringWithUTF8String:propName];
[propertyKeys addObject:propertyName];
}
}
free(properties);
currentClass = [currentClass superclass];
}
return [self dictionaryWithValuesForKeys:propertyKeys];
}
プロパティ名と辞書キーが同じであると仮定すると、この関数を使用して任意のオブジェクトを変換できます
- (void) setObject:(id) object ValuesFromDictionary:(NSDictionary *) dictionary
{
for (NSString *fieldName in dictionary) {
[object setValue:[dictionary objectForKey:fieldName] forKey:fieldName];
}
}
これはあなたにとってより便利になります:
- (instancetype)initWithDictionary:(NSDictionary*)dictionary {
if (self = [super init]) {
[self setValuesForKeysWithDictionary:dictionary];}
return self;
}
これを行うのに最適な方法は、シリアル化/逆シリアル化にライブラリを使用することです。多くのライブラリが利用可能ですが、私が好きなのはJagPropertyConverter https://github.com/jagill/JAGPropertyConverter
カスタムオブジェクトをNSDictionaryに、またはその逆に変換できます。
辞書や配列、またはオブジェクト内のカスタムオブジェクトの変換もサポートしています(つまり、コンポジション)
JAGPropertyConverter *converter = [[JAGPropertyConverter alloc]init];
converter.classesToConvert = [NSSet setWithObjects:[Order class], nil];
@interface Order : NSObject
@property (nonatomic, retain) NSString *OrderId;
@property (nonatomic, retain) NSString *Title;
@property (nonatomic, retain) NSString *Weight;
@end
//For Dictionary to Object (AS IN YOUR CASE)
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
[dictionary setValue:self.OrderId forKey:@"OrderId"];
[dictionary setValue:self.Title forKey:@"Title"];
[dictionary setValue:self.Weight forKey:@"Weight"];
Order *order = [[Order alloc]init];
[converter setPropertiesOf:order fromDictionary:dictionary];
//For Object to Dictionary
Order *order = [[Order alloc]init];
order.OrderId = @"10";
order.Title = @"Title;
order.Weight = @"Weight";
NSDictionary *dictPerson = [converter convertToDictionary:person];
「AutoBindObject」から継承するカスタムクラスを定義します。 NSDictionaryのキーと同じ名前のプロパティを宣言します。次に、メソッドを呼び出します。
[customObject loadFromDictionary:dic];
実際には、クラスをカスタマイズして、さまざまなプロパティ名を辞書のキーにマップできます。それに加えて、ネストされたオブジェクトをバインドできます。
このデモをご覧ください。使い方は簡単です:
https://github.com/caohuuloc/AutoBindObject