2017-03-20 1 views
1

Mein Ziel ist es, Felder zu json auf Benutzeranforderung hinzuzufügen.Wrapping von Json-Member-Feldern zu Objekt

Alles ist groß, aber wenn die Felder mit

fmt.Printf("%s: %s\n", content.Date, content.Description) 

ein Fehler auftritt Anzeige:

invalid character '{' after top-level value

Und das liegt daran, dass nach dem Hinzufügen neuer Felder der Datei wie folgt aussieht:

{"Date":"2017-03-20 10:46:48","Description":"new"} 
{"Date":"2017-03-20 10:46:51","Description":"new .go"} 

Das größte Problem ist mit nicht wirklich eine Datei die Schriftfelter

reminder := &Name{dateString[:19], text} //text - input string 
newReminder, _ := json.Marshal(&reminder) 

Ich weiß, wie dies zu tun richtig

Meine Frage ist, wie soll ich alle Mitglieder Felder in ein Objekt wickeln? Und was ist der beste Weg, um durch Mitgliedsfelder zu iterieren?

Der Code ist hier verfügbar: https://play.golang.org/p/NunV_B6sud

+1

Wenn Sie ein Objekt umbrechen möchten, müssen Sie es als Karte marshallen und jede Erinnerung muss einen eindeutigen Namen haben. Sie können jedoch auch als Slice marshallen, JSON erlaubt dem Root-Objekt, ein Array zu sein. –

+0

Ich glaube, Ihre Datei fehlt ein Stammknoten, dh alle Datensätze sind Geschwister ohne Eltern. Deshalb erhalten Sie das "ungültige Zeichen '{' nach dem obersten Wert" – nJoshi

+0

@Paul, Sie müssen klar und spezifisch sein, was Ihre Frage ist, ist es der Fehler, wenn Sie erhalten, wenn Sie Ihren lesen. JSON-Datei? oder Marshaling der Daten in der Hand? – nJoshi

Antwort

0

So nach einigen Recherchen, die Leute in der go-nuts Gruppe half mir und schlug mir vor, einen Streaming-JSON-Parser zu verwenden, der Elemente einzeln analysiert. So

ich brauchte, um meine Erinnerung Listing-Funktion zu ändern:

func listReminders() error { 
    f, err := os.Open("rem.json") 
    if err != nil { 
     return err 
    } 
    dec := json.NewDecoder(f) 
    for { 
     var content Name 
     switch dec.Decode(&content) { 
     case nil: 
      fmt.Printf("%#v\n", content) 
     case io.EOF: 
      return nil 
     default: 
      return err 
     } 
    } 
} 

Jetzt funktioniert alles so, wie ich wollte.

0

Sie die Erinnerungen in ein Array in der JSON-Datei gespeichert werden sollen, wie von @Gerben Jacobs erwähnt, und dann wollen jedes Mal, wenn eine neue Anzeige zu dem Array hinzufügen Sie müssen den vollständigen Inhalt von rem.json lesen, die neue Erinnerung an Go anhängen, die Datei abschneiden und das neue Segment in die Datei schreiben. Hier ist eine schnelle Implementierung https://play.golang.org/p/UKR91maQF2.

Wenn Sie viele Erinnerungen und den Prozess des Lesens, Decodierung, Codierung haben, und den ganzen Inhalt Schreiben werden ein Schmerz Sie die Datei öffnen können, implementieren eine Art und Weise nur die letzten ] aus dem Dateiinhalt, zu kürzen und dann schreib nur , + neue erinnerung + ].

+0

Nun, dein Beispiel funktioniert nicht, nach dem Hinzufügen einer Erinnerung heißt es 'EOF' und während der Anzeige erscheint" unerwartetes Ende der JSON-Eingabe ". – Paul

+0

Sind Sie sicher, dass Sie den Code wörtlich kopiert haben? Ich habe gerade diese Beispielimplementierung ausgeführt und hier ist die Ausgabe: http://imgur.com/TutS0Uv. – mkopriva

+0

Nun, das ist seltsam, ja ich tat, und immer noch der gleiche Fehler auftritt, auch Ihre Variable err wird 3 Mal neu deklariert. Ich habe versucht, es in beide Richtungen zu laufen. – Paul