2017-07-07 5 views
1

Ich lese eine Reihe von JSON-Dateien von S3, und möchte sie alle als ein großes JSON-Array zurückgeben. Ich habe eine Struktur, die meinen JSON-Daten entspricht, und eine for-Schleife, die über alle Objekte in meinem S3-Bucket iteriert. Jedes Mal, wenn ich lese, entpacke ich mein Struktur-Array. Ich möchte an meine Struktur-Array anhängen, so dass ich alle JSON-Daten und nicht nur die Daten einer Datei erhalten kann. Gibt es das überhaupt in Golang?Unmarshal und an Array anhängen gehen

+0

Bitte benutzen Sie [Anfügen] versuchen (https://golang.org/pkg/builtin/#append)? – mkopriva

+0

Muss ich einen temporären Slice erstellen, um ihn anzuhängen? B/c 'Unmarshal' gibt nichts zurück, kann das also nicht anhängen. –

+0

Sie entpacken die Datei in den struct-Wert und hängen die Struktur an den Slice an. Nachdem die Schleife fertig ist, geben Sie den Slice zurück. – mkopriva

Antwort

1

Ja, Sie sollten ein temporäres Array erstellen, um den Inhalt jedes JSONs zu unmarshalen, und dann die Elemente an Ihr endgültiges Ergebnis-Array anhängen, um die gesamte Sammlung als ein Element zurückzugeben.

Sehen Sie hier ein Beispiel dafür.

In Ihrem Fall würde input von jeder der S3-Dateien kommen, die Sie erwähnen. Außerdem würden Sie diese Unmarshol-Logik wahrscheinlich in eine eigene Funktion setzen, um sie für jeden JSON-Eingang aufrufen zu können.

package main 

import (
    "encoding/json" 
    "fmt" 
    "log" 
) 

type Record struct { 
    Author string `json:"author"` 
    Title string `json:"title"` 
} 

func main() { 
    var allRecords []Record 

    input := []byte(`[{ 
     "author": "Nirvana", 
     "title": "Smells like teen spirit" 
    }, { 
     "author": "The Beatles", 
     "title": "Help" 
    }]`) 

    var tmpRecords []Record 
    err := json.Unmarshal(input, &tmpRecords) 
    if (err != nil) { 
     log.Fatal(err) 
    } 

    allRecords = append(allRecords, tmpRecords...) 

    fmt.Println("RECORDS:", allRecords) 
} 

https://play.golang.org/p/ZZGhy4UNhP

+0

Bitte beachten Sie, dass es keinen Sinn macht, über 'tmpRecords' zu schleifen, da dieses 'slice = append (slice, anotherSlice ...)' dasselbe tut. – mkopriva

+0

@mkopriva: Ja, das stimmt. Bearbeitete den Code. – eugenioy