2012-02-26 26 views
54

Ho bisogno di decodificare una stringa JSON con il numero di galleggiare come:Come decodificare JSON con il tipo convertire da stringa a float64 in Golang?

{"name":"Galaxy Nexus", "price":"3460.00"} 

io uso il codice Golang di seguito:

package main 

import (
    "encoding/json" 
    "fmt" 
) 

type Product struct { 
    Name string 
    Price float64 
} 

func main() { 
    s := `{"name":"Galaxy Nexus", "price":"3460.00"}` 
    var pro Product 
    err := json.Unmarshal([]byte(s), &pro) 
    if err == nil { 
     fmt.Printf("%+v\n", pro) 
    } else { 
     fmt.Println(err) 
     fmt.Printf("%+v\n", pro) 
    } 
} 

quando l'eseguo, ottenere il risultato:

json: cannot unmarshal string into Go value of type float64 
{Name:Galaxy Nexus Price:0} 

Voglio sapere come decodificare la stringa JSON con tipo convert.

risposta

112

La risposta è molto meno complicato. Basta aggiungere dire al JSON interpeter è un float64 stringa codificata con ,string (nota che ho cambiato solo la definizione Price):

package main 

import (
    "encoding/json" 
    "fmt" 
) 

type Product struct { 
    Name string 
    Price float64 `json:",string"` 
} 

func main() { 
    s := `{"name":"Galaxy Nexus", "price":"3460.00"}` 
    var pro Product 
    err := json.Unmarshal([]byte(s), &pro) 
    if err == nil { 
     fmt.Printf("%+v\n", pro) 
    } else { 
     fmt.Println(err) 
     fmt.Printf("%+v\n", pro) 
    } 
} 
+0

Grazie! Penso che questa sia la soluzione migliore per il mio problema. Potresti dirmi dov'è il documento ufficiale sull'uso di ", stringa"? – yanunon

+5

L'ho trovato su [link] (http://weekly.golang.org/pkg/encoding/json/). – yanunon

+0

+1 È fantastico. Non lo sapevo. – Mostafa

5

Il passaggio di un valore tra virgolette rende l'aspetto simile a una stringa. Cambia "price":"3460.00" a "price":3460.00 e tutto funziona correttamente.

Se non è possibile eliminare le quotazioni segna bisogna analizzare da soli, utilizzando strconv.ParseFloat:

package main 

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

type Product struct { 
    Name  string 
    Price  string 
    PriceFloat float64 
} 

func main() { 
    s := `{"name":"Galaxy Nexus", "price":"3460.00"}` 
    var pro Product 
    err := json.Unmarshal([]byte(s), &pro) 
    if err == nil { 
     pro.PriceFloat, err = strconv.ParseFloat(pro.Price, 64) 
     if err != nil { fmt.Println(err) } 
     fmt.Printf("%+v\n", pro) 
    } else { 
     fmt.Println(err) 
     fmt.Printf("%+v\n", pro) 
    } 
} 
+0

c'è un modo che non cambiare il 'prodotto' struct e implementare una funzione di decodifica o interfaccia per analizzare la stringa di galleggiare? – yanunon

+1

@yanunon Sì, puoi usare una mappa di tipo 'map [string] interface {}' per 'Unmarshal' e analizzarla nella tua struct. – Mostafa

+0

@yanunon Oppure se vuoi la flessibilità ** real **, puoi scrivere il tuo 'Unmarshal', che chiama default 'Unmarshal' con una' map [string] interface {} ', ma usa' reflect' e 'strconv' pacchetti per fare l'analisi. – Mostafa

4

solo ti permette di sapere che si può fare questo senza Unmarshal e utilizzare json.decode. Ecco Go Playground

package main 

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

type Product struct { 
    Name string `json:"name"` 
    Price float64 `json:"price,string"` 
} 

func main() { 
    s := `{"name":"Galaxy Nexus","price":"3460.00"}` 
    var pro Product 
    err := json.NewDecoder(strings.NewReader(s)).Decode(&pro) 
    if err != nil { 
     fmt.Println(err) 
     return 
    } 
    fmt.Println(pro) 
} 
Problemi correlati