2016-06-13 53 views
5

Sto cercando di creare un semplice strumento che analizzi le righe in formato JSON in un file ed esegua un'operazione INSERT in un database.Timestamp di analisi completa in Golang

ho una struct che assomiglia a questo:

type DataBlob struct { 
    .... 
    Datetime time.Time `json:"datetime, string"` 
    .... 
} 

e l'analisi di codice che assomiglia a questo:

scanner := bufio.NewScanner(file) 
// Loop through all lines in the file 
for scanner.Scan() { 
    var t DataBlob 

    // Decode the line, parse the JSON 
    dec := json.NewDecoder(strings.NewReader(scanner.Text())) 
    if err := dec.Decode(&t); 
    err != nil { 
     panic(err) 
    } 

    // Perform the database operation 
    executionString: = "INSERT INTO observations (datetime) VALUES ($1)" 
    _, err := db.Exec(executionString, t.Datetime) 
    if err != nil { 
     panic(err) 
    } 
} 

Il mio file JSON ha linee, ciascuna contenente un valore datetime che assomiglia a questo :

{ "datetime": 1465793854 } 

Quando il datetime è formattato come un timestamp Unix, il Marshaller lamenta:

panic: parsing time "1465793854" as ""2006-01-02T15:04:05Z07:00"": cannot parse "1465793854" as """ 

Nello script che genera il JSON (scritto anche in Golang), ho provato semplicemente stampando la rappresentazione String del tipo Time.time, producendo il seguente:

{ "datetime": "2016-06-13 00:23:34 -0400 EDT" } 

al che il Marshaller lamenta quando vado a analizzarlo:

panic: parsing time ""2016-06-13 00:23:34 -0400 EDT"" as ""2006-01-02T15:04:05Z07:00"": cannot parse " 00:23:34 -0400 EDT"" as "T" 

Se Ho anche trattare questo timestamp (che sembra abbastanza standard) come String ed evitare il problema Marshalling, Postgres si lamenta quando si tenta di eseguire l'inserimento:

panic: pq: invalid input syntax for type timestamp: "2016-06-13 00:23:34 -0400 EDT" 

Questo è frustrante su una serie di livelli, ma soprattutto perché se serializzo un tipo Time.time, penso che dovrebbe essere ancora compreso dall'altro lato del processo.

Come posso andare sull'analisi di questo timestamp per eseguire l'inserimento del database? Chiede scusa per la lunga domanda e grazie per il tuo aiuto!

risposta

6

JSON Unmarshalling time.Timeexpects data string essere in formato RFC 3339.

Quindi, nel tuo programma golang che genera il JSON, invece di stampare semplicemente il valore time.Time, utilizzare Format per stamparlo nel formato RFC 3339.

t.Format(time.RFC3339) 

se serializzare un tipo time.time, penserei che dovrebbe comunque essere compreso dall'altra parte del processo

Se è stato utilizzato il Marshaller interface con la serializzazione, si produrrebbe effettivamente la data nel formato RFC 3339. Quindi l'altra parte del processo lo capirà. Quindi puoi farlo anche tu.

d := DataBlob{Datetime: t} 
enc := json.NewEncoder(fileWriter) 
enc.Encode(d)