2012-02-26 11 views
54

necesito para decodificar una cadena JSON con el número de flotación como:¿Cómo decodificar JSON con el tipo convertir de cadena a float64 en Golang?

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

utilizo el código Golang a continuación:

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) 
    } 
} 

Cuando lo ejecuto, obtener el resultado:

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

Quiero saber cómo decodificar la cadena JSON con type convert.

Respuesta

112

La respuesta es mucho menos complicado. Sólo tiene que añadir a contar la JSON interpeter es un float64 codificada cadena con ,string (nota que sólo cambió la definición 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

¡Gracias! Creo que esta es la mejor solución para mi problema. ¿Podría decirme dónde está el documento oficial sobre el uso de ", cadena"? – yanunon

+5

Lo encontré en [link] (http://weekly.golang.org/pkg/encoding/json/). – yanunon

+0

+1 Eso es increíble. No sabía sobre eso. – Mostafa

5

Al pasar un valor entre comillas, se ve como una cadena. Cambie "price":"3460.00" a "price":3460.00 y todo funciona bien.

Si no puede dejar caer las cotizaciones de marca que tiene que analizar por sí mismo, utilizando 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

¿Hay alguna manera de que no cambiar la estructura de 'productos' y poner en práctica una función de decodificación o interfaz para analizar la cadena de flotar? – yanunon

+1

@yanunon Sí, puedes usar un mapa del tipo 'map [string] interface {}' para 'Unmarshal', y analizar eso en tu struct. – Mostafa

+0

@yanunon O si quieres flexibilidad ** real **, puedes escribir tu propio 'Unmarshal', que llama' Unmarshal' por defecto con un 'map [string] interface {}', pero usa 'reflect' y' strconv' paquetes para hacer el análisis sintáctico – Mostafa

4

simplemente para hacerle saber que usted puede hacer esto sin Unmarshal y utilizar json.decode. Aquí es 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) 
} 
Cuestiones relacionadas