2015-11-26 36 views
6

Ho un file di registro, in cui ogni riga è un JSON. A causa di alcuni motivi di sicurezza Nginx, i registri vengono salvati in un formato esadecimale (ad esempio, il carattere "saranno convertiti in \ x22) Ecco un esempio di una linea di JSON:.Vai - Come decodificare/convertire un file txt contiene caratteri esadecimali in stringa leggibile

{ "body_bytes_sent": "474", "params": {\x22device_id\x22: \x221234567890\x22} } 

Il mio obiettivo:

  1. Leggere il file riga per riga.
  2. Convertire ogni riga in un formato leggibile

    { "body_bytes_sent": "474", "params" : {"device_id": "1234567890"} } 
    
  3. Convertire questa str in un oggetto JSON in modo da poterlo manipolare.

Qualsiasi aiuto sarà apprezzato.

risposta

4

È possibile utilizzare strconv.Unquote per convertire la stringa in uno normale:

package main 

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

func main() { 

    // this is what your input string looks like... 
    qs := "{\\x22device_id\\x22: \\x221234567890\\x22}" 

    // now let's convert it to a normal string 
    // note that it has to look like a Go string literal so we're 
    // using Sprintf 
    s, err := strconv.Unquote(fmt.Sprintf(`"%s"`, qs)) 
    if err != nil { 
     panic(err) 
    } 
    fmt.Println(s) 

    // just for good measure, let's see if it can actually be decoded. 
    // SPOILER ALERT: It decodes just fine! 
    var v map[string]interface{} 
    if err := json.Unmarshal([]byte(s), &v); err != nil { 
     panic(err) 

    } 
    fmt.Println(v) 
} 

Playground

+0

Grazie! Mi dà una soluzione per il caso che ho descritto la mia domanda, ma non risolve il caso quando la stringa è un mix di JSON valido e non valido. Vedi la mia domanda aggiornata. Grazie ancora! A proposito, questo accade perché il nginx codifica solo i parametri del corpo della richiesta. – Asaf

+0

@Asaf: Perché il codice di Not_a_Golfer non dovrebbe fallire nel "mix di JSON valido e non valido"? – Volker

+0

Se eseguo il codice di @Not_a_Golfer, ottengo l'errore "sintassi non valida" su questa riga 's, err: = strconv.Unquote (fmt.Sprintf ("% s ", qs))' – Asaf