Frage

Ich verwende Json-Framework eine NSDictionary aus einer JSON-Antwort zu erstellen. So viel funktioniert wunderbar.

Nun, in dieser JSON Nutzlast sind ein oder mehr Objekte - lassen Sie sie nennen X. Art wie diese in XML:

<OBJECTS>
  <X>
    ...
  </x>
  <X>
    ...
  </X>
  <X>
    ...
  </X>
</OBJECTS>

Wenn ich mich in dem oben genannten NSDictionary Objekt für alle Xs, etwa so:

NSDictionary *results = [[dict objectForKey:@"OBJECTS"] objectForKey:@"X"];

Oder auch:

NSDictionary *results = [dict valueForKeyPath:@"OBJECTS.X"];

ich werde, nach GDB, ein NSCFArray von NSDictionary Objekten. (Ja, ich rieche etwas komisch hier auch, aber mehr dazu in einem Moment).

Wenn nur gibt es ein Objekt mit dem Namen X, bekomme ich wieder eine ehrliche-to-Güte NSDictionary.

Also ... was soll ich tun, um dies konsequent zu machen verhalten, egal wie viele Xs gibt es?

Auf den ersten Blick würde ich glaube, ich zu sein, nur Ergebnisse ändern NSArray * , aber was passiert, wenn ich will die Ergebnisse schnell aufzählen über? Im Moment habe ich dies zu tun:

for (NSDictionary *result in results)

Im NSCFArray Fall (mehr Xs), bekomme ich wieder eine individuelle NSDictionary für jedes X. Im einzelnen X Fall, bekomme ich wieder die eine NSDictionary, außer jetzt meine Perspektive ist eine Ebene zu tief. Mit anderen Worten, anstelle diesem (erfundenen Beispiel):

(gdb) po results
<NSCFArray 0xd4a940>(
{
    foo =     {
        bar = "something";
    };
}
{
    foo =     {
        bar = "something else";
    };
}
)

Ich bekomme diese:

(gdb) po results
{
    foo =     {
        bar = "something";
    };
}

Clues willkommen / geschätzt! Sie können sogar fragen, ob es notwendig ist, diese auseinander überhaupt zu haben, zu brechen, aber jetzt nehmen wir an, diese Reise wirklich notwendig ist. (Still, ich bin glücklich, sonst davon überzeugt zu werden, wenn jemand stark genug um es sich anfühlt.)

Schließlich am Ende des Tages, ich möchte eine NSArray von NSDictionary Objekte haben.

War es hilfreich?

Lösung

Ich bin nicht vertraut mit JSON oder JSON-Framework, aber klar kann objectForKey nicht die X verwendet werden, um Zugriff, da sie alle den gleichen Schlüssel haben.

Wenn Sie wissen, dass objectForKey: @ „Objekte“ zurückkehren wird entweder ein NSDictionary (einzelnes Element) oder eine NSArray von NSDictionarys (mehrfache X-Elemente), dann könnte man so etwas wie:

if ( ![results isKindOfClass:[NSArray class]] ) {
    results =[NSArray arrayWithObject:results];
}

Das wird Ihnen ein konsistentes Ergebnis erhalten, Sie genau unter der Annahme verstehen, wie der Json-Framework verhalten. Es wird etwas zerbrechlich sein, wenn die Elemente immer eine Reihe von Einträgen anstelle eines NSDitionary zurückkehren, dann wird es alle auseinander fallen.

Es kann eine Konfiguration Einstellung für die Json-Framework, mit dem Sie steuern, wie es in diesem Fall verhält und das wäre vorzuziehen.

Andere Tipps

NSDictionary *results = [[dict objectForKey:@"OBJECTS"] objectForKey:@"X"];

und

NSDictionary *results = [dict valueForKeyPath:@"OBJECTS.X"];

Die beiden oben genannten sind genau gleich. Die erste Operation ist ein wenig kostspieliger Betrieb als der zweite.

Hier ist, was ich am Ende tun:

// Get the JSON response and return the result:
NSString *jsonString = [NSString stringWithContentsOfURL:url];
NSDictionary *dict = [jsonString JSONValue];

// If OBJECTS.X gets a dictionary (one value), make an array of one.
id myObject = [dict valueForKeyPath:@"OBJECTS.X"];
if ([myObject isKindOfClass:[NSDictionary class]]) {
    results = [NSArray arrayWithObject:myObject];
} else {
    results = myObject;
}

Es ist erwähnenswert, dass JsonValue können auch zurückkehren ein Wörterbuch oder ein Array. Allerdings bin ich in der Wörterbuch post-Zuordnung suchen (OBJECTS.X).

Ich glaube nicht, Ihre zwei Codebeispiele,

NSDictionary *results = [[dict objectForKey:@"OBJECTS"] objectForKey:@"X"];

und

NSDictionary *results = [dict valueForKeyPath:@"OBJECTS.X"];

sind gleichwertig. Schlüsselwert-Codierung hat einige zusätzliche Smarts mit Sammlungen zu arbeiten, die Sie ab hier könnte zu werfen. (Ein Beispiel finden Sie im Blog-Eintrag gefunden werden Theocacao. NSArray und KVC von Scott Stevenson) Wenn Sie zurück in die ehemalige zurückkehren Sie könnten das Verhalten erhalten Sie erwarten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top