2013-03-20 6 views
10

Frust auf der Oberseite !!!Schreibe JSON Antwort auf .plist Datei

Ich erhalte einig JSON Antwort aus dem Service und ich möchte es speichern, in der .plist Datei für die Zukunft. Ich kann meine JSON-Antwort auf .plist-Datei nicht speichern. Ich denke, es ist aufgrund einiger null Werte in die Antwort.

Hinweis:ich bestätigt, dass die Antwort in JSON-Format istjsonparser verwenden.


Mein Code:

NSError *error; 
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; 
NSDictionary *dictResult = [(NSDictionary*)json objectForKey:@"myKey"]; 
NSLog(@"Result Dictionary :: %@",dictResult); 

NSURL *cacheDir = [[[NSFileManager defaultManager] URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask] lastObject]; 
NSURL *path = [cacheDir URLByAppendingPathComponent:@"FinalResult.plist"]; 
NSLog(@"Path :: %@",path); 

BOOL success = [dictResult writeToURL:path atomically:YES]; 
NSLog(@"success? %d", success); 

Hinweis:Ich habe alle NSLog Werte (bedeutet die Antwort Wörterbuch und Dateipfad aber 0 für Erfolg).


Problem: Es gibt fast 70-80 Schlüssel-Wert-Paare in der Antwort, und ich will nicht zu entfernen/ersetzen alle null Werte. Denn das, was ich will, ist ...

  1. GET die Antwort vom Server.
  2. Füllen Sie alle UITextFields mit der Antwort.
  3. POST die gleiche Antwort auf den Server mit einigen Bearbeitete Werte von der UITextFields.

Also, ich will nur die Edited UITextField Werte im Objekt ändern, und lassen Sie es auf dem Server nach.

Was ist der beste Weg, um dies zu beheben?

+0

Welche Arten von Daten enthält das JSON-Wörterbuch? Saiten, Zahlen, noch etwas? Kannst du das JSON zu deiner Frage hinzufügen? –

+0

@TomHarrington: Mein JSON-Wörterbuch enthält fast alle Arten von Werten, die Sie in Ihrer Antwort erwähnt haben. – Bhavin

Antwort

16

Ich wette, dass Ihr JSON mindestens ein null Wert enthält.

Wenn Sie JSON, die null enthält und Sie wandeln es NSJSONSerialization verwenden, wird die null durch eine Instanz von NSNull ersetzt. Wenn Ihr Wörterbuch enthält, schlägt writeToURL:atomically: fehl.

Dies liegt daran, dass die praktischen Methoden zum Lesen und Schreiben von Wörterbüchern (und Arrays) nur funktionieren, wenn die Daten in der Auflistung auf Eigenschaftenlistentypen beschränkt sind. Diese sind:

  • NSString
  • NSNumber
  • NSData
  • NSDate
  • NSArray
  • NSDictionary. Und für Wörterbücher müssen die Schlüssel NSString s sein.

Sie können auch änderbare Unterklassen (wie NSMutableString) beim Schreiben verwenden.

Wenn Sie etwas haben, das nicht auf dieser Liste steht, können Sie weder writeToURL:atomically noch eine der ähnlichen Komfortmethoden verwenden.

Das Problem ist, dass einige gültige JSON nicht in Eigenschaftslisten konvertiert werden können. Außerdem können einige gültige Eigenschaftslisten nicht in JSON konvertiert werden (weil NSDate nicht automatisch in gültige JSON konvertiert wird).

Wenn ich es wäre, würde ich nur die Daten in eine JSON-Datei schreiben. Belassen Sie es in seinem ursprünglichen Format. Sie können einfach zu/von JSON konvertieren, also lassen Sie es so.

+0

+1. Ja, du hast absolut recht. Es gibt einige Werte in meiner JSON-Antwort. Also was zu tun? – Bhavin

+5

Wie gesagt, ich denke, die beste Idee ist, die Daten als JSON zu belassen und in eine Datei zu schreiben, anstatt zu versuchen, eine Eigenschaftsliste zu verwenden. Wenn Sie eine Eigenschaftsliste verwenden müssen, müssen Sie das gesamte Wörterbuch durchsuchen und die Nullen in etwas konvertieren, das in einer Eigenschaftslistendatei gespeichert werden kann. –

+0

Ich möchte mehr als nur "Ich stimme zu" sagen, und so unterstütze ich, was @ TomHarrington sagt, indem ich erwähne, dass ich eine App habe, die json in eine PropertyList umwandelt, so dass sie in NSUserDefaults geschrieben werden kann. Und zu diesem Zweck ist die einzige Lösung für die Werte in der JSON-Antwort, sie nacheinander zu erkennen und nicht zu konvertieren/nicht auszugeben. –

-1
  • Überprüfen Sie, ob der Rückgabewert der writeToURL:atomically:-Methode YES zurückgibt.
  • Wenn nicht, prüfen Sie, ob Sie Schreibrechte für diese URL haben.
  • Versuchen Sie es mit einer anderen URL, um herauszufinden, ob es der Pfad oder der Inhalt des Wörterbuchs ist, das diesen Fehler verursacht.
1

ich meine Datei Urls auf diese Weise bauen:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
NSString *path = [paths objectAtIndex:0]; 
NSString *filename = @"FinalResult.plist"; 
NSString *pathFilename = [path stringByAppendingPathComponent:filename]; 

Dann sehen, ob dies schreibt:

BOOL success = [dictResult writeToFile:pathFilename atomically:YES]; 
NSLog(@"success? %d", success); 

bearbeiten - Lustig, ich habe gerade vor kurzem dieses Problem konfrontiert, und dann alle vergessen darüber. Einige JSON-Parser verwenden [NSNull null] als Platzhalter für Nullwerte. Ich schrieb diese (ernsthaft, nur etwa zwei Wochen und dann auf sie Abstand), um das Parsen Ergebnis aufzuräumen ...

- (NSDictionary *)compact:(NSDictionary *)aDictionary { 

    NSDictionary *answer = [NSMutableDictionary dictionary]; 

    for (NSString *key in [aDictionary allKeys]) { 
     id value = [self.dictionary valueForKey:key]; 
     if (value && value != [NSNull null]) { 
      [answer setValue:value forKey:key]; 
     } 
    } 
    return [NSDictionary dictionaryWithDictionary:answer]; 
} 

Dies könnte in eine NSDictionary Kategorie zusätzlich gemacht werden, wenn man wollte.

+1

Es ist nichts falsch mit seinem Code, um die URL zu erstellen. –

+0

Ich habe den Pfad, aber .plist Datei wird nicht erstellt. – Bhavin

+0

@Vin kann Ihr eigenes Wörterbuch mit nur einem String-Schlüssel und Wert erstellen, sehen Sie, schreibt? Da Sie das Wörterbuch von Jason haben, denke ich, dass jeder hier seine Serialisierung annimmt, aber fangen wir an, die Dinge zu erledigen. Ein einfaches Wörterbuch, das richtig schreibt, wird uns viel erzählen. – danh

-1

dies versuchen, wird es funktionieren:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"country.plist"]; 
[jsonData writeToFile:path atomically:YES]; 
3
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); 
NSString *libraryPath = [paths objectAtIndex:0]; 
NSString *filename = @"FinalResult.plist"; 
NSString *pathFilename = [libraryPath stringByAppendingPathComponent:filename]; 

NSDictionary *dictResult = [json objectForKey:@"myKey"]; 
[dictResult writeToFile:pathFilename atomically:YES]; 
+0

Dies ist nicht das Problem, mein Freund. Haben Sie Tom Harringtons Antwort überprüft? – Bhavin

+0

@Vin Sie haben angegeben, dass Sie keine Daten in PLIST speichern können, meine Antwort ist dafür und "Tom Harrington" hat erklärt, welche Art von Objekten Sie in plist speichern können –

+0

Der Grund, warum ich keine Daten speichern kann plist ist nicht in Ihrer Antwort angegeben. – Bhavin

11

Wenn Ihr Wörterbuch enthält NSNull, dann writeToURL:atomically: fehl.

Für Wörterbücher muss der Schlüssel NSStrings sein. Das Problem ist, dass einige gültige JSON nicht in Eigenschaftslisten konvertiert werden können. Außerdem können einige gültige Eigenschaftslisten nicht in JSON konvertiert werden.

Vergessen Sie nicht, Wenn Sie eine Eigenschaftsliste verwenden müssen, müssen Sie das gesamte Wörterbuch durchsuchen und die Nullen in etwas konvertieren, das in einer Eigenschaftslistendatei gespeichert werden kann.

einzige Lösung ist, dass Sie alle NULL-Werte zu überprüfen und ersetzen es mit @“".

Happy Coding ...