2011-11-25 10 views
84

Estoy tratando de convertir una estructura Go a JSON usando el paquete json pero todo lo que obtengo es {}. Estoy seguro de que es algo totalmente obvio, pero no lo veo.Conversión Ir estructura a JSON

package main 

import (
    "fmt" 
    "encoding/json" 
) 

type User struct { 
    name string 
} 

func main() { 
    user := &User{name:"Frank"} 
    b, err := json.Marshal(user) 
    if err != nil { 
     fmt.Printf("Error: %s", err) 
     return; 
    } 
    fmt.Println(string(b)) 
} 

Entonces cuando intento ejecutarlo me sale esto:

$ 6g test.go && 6l -o test test.6 && ./test 
{} 

Respuesta

173

Necesitas exportUser.name el campo para que el paquete json puede verlo. Cambie el nombre del campo name al Name.

package main 

import (
    "fmt" 
    "encoding/json" 
) 

type User struct { 
    Name string 
} 

func main() { 
    user := &User{Name: "Frank"} 
    b, err := json.Marshal(user) 
    if err != nil { 
     fmt.Println(err) 
     return 
    } 
    fmt.Println(string(b)) 
} 

de salida:

{"Name":"Frank"} 
+51

Tenga en cuenta que puede agregar '\' json: "nombre" \ '' al final de la definición del campo struct para conservar el nombre del resultado. – Dustin

+8

Yo veo. Me gusta el lenguaje, pero creo que algunos elementos sintácticos van más allá. Si el nombre de un miembro de la estructura determina el comportamiento, esto es simplemente incorrecto. – magiconair

+1

Bueno, hacer que el nombre determine el comportamiento se puede debatir si es bueno o malo :), pero es seguro que sea fácil saber si un campo se exporta o no sin tener que verificar en otro lugar. – Olof

4

valores Struct codifican como objetos JSON. Cada campo se convierte en estructura exportada un miembro del objeto a menos que:

  • la etiqueta del campo es "-", o
  • el campo está vacío y su etiqueta especifica la opción "omitempty".

Los valores vacíos son falsas, 0, cualquier valor de puntero o interfaz nil, y
cualquier matriz, rebanada, mapa, o cadena de longitud cero. La cadena de clave predeterminada del objeto
es el nombre de campo de estructura, pero se puede especificar en el valor de etiqueta del campo struct
. La clave "json" en el valor de la etiqueta del campo struct es el nombre de la clave
, seguido de una coma opcional y opciones.

22

cuestión relacionada:

que estaba teniendo problemas para convertir estructura a JSON, enviándolo como respuesta de Golang, luego, más tarde coger el mismo en JavaScript a través de Ajax.

Perdió un montón de tiempo, por lo que la solución de publicación aquí.

En Go:

// web server 

type Foo struct { 
    Number int `json:"number"` 
    Title string `json:"title"` 
} 

foo_marshalled, err := json.Marshal(Foo{Number: 1, Title: "test"}) 
fmt.Fprint(w, string(foo_marshalled)) // write response to ResponseWriter (w) 

En JavaScript:

// web call & receive in "data", thru Ajax/ other 

var Foo = JSON.parse(data); 
console.log("number: " + Foo.number); 
console.log("title: " + Foo.title); 

Esperamos que esto ayude a alguien.
La mejor de las suertes.

Cuestiones relacionadas