2010-09-14 11 views
14

ich einige JSON von einem Webdienst analysieren, gibt dies mir eine NSDictionary, ich dieses Wörterbuch auf einem valueEntity des Typs NSObject vonGibt es eine umgekehrte "setValuesForKeysWithDictionary" - eine makeDictionaryWithObjectProperties?

bewohnter Eigenschaften verwenden
[myObject setValuesForKeysWithDictionary:JSONDict]; 

(myObject hat die gleichen Eigenschaftennamen und Typen als Wörterbuch aus dem JSON-Parser)

name = name 
count = count 
startDate = startDate 
etc.. 

gibt es eine Möglichkeit in die andere Richtung zu gehen, wo ich eine NSDictionary, die ich „gefüllt“ mit den Eigenschaften und ihre Werte aus einer meiner NSObject Unterklasse haben möchte. Wie ich schon im Titel vorschlagen, etwas entlang der Linien von dieser:

einen Weg

MyObject *myObject = [[MyObject alloc] init]; 
[myObject setValuesForKeysWithDictionary:JSONDict]; 

andersrum hierfür ist

NSMutableDictionary *dict = [myObject makeDictionaryWithObjectProperties]; 

Der Grund um, dass ich habe eine valueEntity, die nach Protokoll meinen Ansichten entspricht, aber ich möchte auch ein NSManagedObject mit den Werten füllen. Also dachte ich mir, dass ich mit NSDictionary als Zwischenschritt umgehen kann, indem ich eine Kategorie in meinem NSManagedObject erstellen muss, die jede Eigenschaft manuell aus dem Wert für mein Objekt-Unterklassen-NSObject einstellt.

Mit einem Wörterbuch ich gehen kann:

[myManagedObject setValuesForKeysWithDictionary:dict]; 

Ich kann einfach nicht die Wörterbuch Darstellung wieder aus, sobald ich die oben getan?

Antwort

17

Yep, die Methode ist:

- (NSDictionary *)dictionaryWithValuesForKeys:(NSArray *)keys 

Sie passieren in einer Reihe von Tasten, die die Objekteigenschaften, die Sie interessiert sind, und ein Wörterbuch wieder die Eigenschaftswerte enthält.

Das Protokoll NSKeyValueCoding definiert eine Reihe von leistungsfähigen und sehr nützlichen Methoden; Es ist eine großartige Sache, sich damit vertraut zu machen.

http://developer.apple.com/library/ios/#documentation/cocoa/reference/foundation/Protocols/NSKeyValueCoding_Protocol/Reference/Reference.html

Es gibt auch einen sehr wertvollen Wegbegleiter:

http://developer.apple.com/library/ios/documentation/cocoa/Conceptual/KeyValueCoding/KeyValueCoding.html#//apple_ref/doc/uid/10000107i

+0

Hallo jlehr, danke :) Ich sehe, dass es nicht so automatisch ist wie das [obj setValuesforKeysWithDictionary: dict], aber dann, wie Yuji darauf hinweist, ist es möglich, die Eigenschaften auszuwählen und Beziehungen zu vermeiden usw Das ist wirklich großartig, da ich jetzt ein einzelnes Array von Eigenschaftsnamen verwalten kann, die über Objekte verteilt sind, und dies ist eine viel flexiblere Lösung. Nochmals vielen Dank, werde gleich auf die Führer kommen. – RickiG

+0

Hey Ricki, kein Problem :-) – jlehr

+0

Danke für die Antwort .. Ich war auf der Suche nach dem gleichen ... :) – Mrunal

5

Haben Sie wirklich alle Eigenschaften zu bekommen? Oft ist es nicht sinnvoll, alle Eigenschaften eines Objekts als Wörterbuch zu verwenden. Zum Beispiel, wenn eine eine Beziehung enthält, möchten Sie es auch im Wörterbuch bekommen? Wenn ja, wie möchten Sie es darstellen?

Wie jlehr sagte, ist es besser, eine Reihe von Schlüsseln explizit mit dictionaryWithValuesForKeys: zu füttern.

Das heißt, mit der gefürchteten Objective-C-Laufzeit können Sie tatsächlich makeDictionaryWithObjectProperties implementieren. Verwenden Sie class_getPropertyList und property_getName. Ich werde nicht erklären, wie das geht, denn wenn Sie diesem Ansatz folgen, wissen Sie, was Sie tun.

Übrigens ist es sehr gefährlich für Sie, ein JSON Objekt, das aus dem Internet zurückgegeben wird, einem NSManagedObject unter Verwendung setValuesForKeysWithDictionary: zuzuweisen. Denn wenn das JSON Objekt zufällig einen zusätzlichen Schlüssel enthält, den Sie nicht erwarten, kann Ihr Code plötzlich abstürzen. Also, tun Sie das nicht.

Ein weiterer Kommentar: Ihre Pseudo-Code

NSObject *myObject = [[NSObject alloc] init]; 
[myObject setValuesForKeysWithDictionary:JSONDict]; 

macht nicht viel Sinn machen: ja Sie setValuesForKeysWithDictionary: gegen NSObject nennen kann, aber es wird kläglich scheitern, weil Sie nicht setValue:forKey: für einen der Einträge können in JSONDict zu einer Vanille NSObject. Ich nehme an, Sie wissen das, aber ich möchte das ausdrücklich sagen, damit ein Neuling, der auf diese Seite stößt, nicht getäuscht wird.

+0

Hallo Yuji und danke auch. Ich sollte noch nicht die Laufzeit-Route gehen :) Ich werde nur das NSObject-Beispiel zu etwas Sinnvollem machen, ich bin wirklich froh, dass ihr beide verstanden habt, was ich zu erreichen versuchte, trotz der Tatsache, dass mir die Worte fehlten, um es zu beschreiben genau. Ich analysiere, verfeinere und validiere meine JSON-Werte, bevor sie auf das Objekt "auf" gehen, aber ich danke Ihnen nochmals, dass ich einige gute Hinweise aus Ihren Antworten bekomme. – RickiG

+0

Gern geschehen :) – Yuji

1

This guy here verwendet einige Laufzeit Magie, um alle Eigenschaften für ein Objekt deklariert und das Wörterbuch ohne manuell die Eigenschaftsnamen zu erhalten.

Und es gibt auch diese nice github repo Ich fand, Sie tun ziemlich genau den gleichen Trick, aber in einem schönen Paket. Sie haben auch die Fähigkeit, ein JSON oder PLIST von einem Objekt zu erstellen.

+0

[AutoMagicCoding] (https://github.com/psineur/NSObject-AutomagicCoding) war wirklich nützlich für mich, genau das, was ich gesucht habe :) – Alex75

Verwandte Themen