2011-11-25 10 views
84

Próbuję przekonwertować strukturę Go na JSON przy użyciu pakietu json, ale otrzymuję tylko {}. Jestem pewien, że jest to coś zupełnie oczywistego, ale tego nie widzę.Konwersja struktury Go na 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)) 
} 

Wtedy, gdy próbuję uruchomić go uzyskać to:

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

Odpowiedz

173

Trzeba export pole User.name tak, że pakiet json może go zobaczyć. Zmień nazwę pola name na 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)) 
} 

wyjściowa:

{"Name":"Frank"} 
+51

Zauważ, że możesz dodać '\' json: "name" \ '' na końcu definicji pola struct, aby zachować nazwę wyjściową. – Dustin

+8

Rozumiem. Trochę lubię ten język, ale myślę, że niektóre elementy syntaktyczne sięgają daleko. Jeśli nazwa elementu struct określa zachowanie, to jest to po prostu niepoprawne. – magiconair

+1

Cóż, posiadanie nazwy określającej zachowanie może być przedmiotem dyskusji, jeśli jest dobre lub złe :), ale z pewnością ułatwi sprawdzenie, czy pole jest eksportowane, czy nie, bez konieczności sprawdzania gdzie indziej. – Olof

4

wartości struct zakodować jako obiekty JSON. Każde pole struct eksportowane staje członkiem obiektu, chyba że:

  • tag dziedzinie jest „-” lub
  • pole jest puste i jego tag określa opcję „omitempty”.

Puste wartości są fałszywe, 0, każda wskazówka lub zerowa wartość interfejs i
każdy tablicy, kawałek, mapa, czy ciąg o długości zerowej. Domyślny łańcuch obiektu to
to nazwa pola struct, ale można ją podać w wartości pola field struct. Klucz "json" w wartości znacznika pola struct to nazwa klucza
, po której następuje opcjonalny przecinek i opcje.

22

Powiązane problem:

miałem problemy struct konwersji do formatu JSON, podając go jako odpowiedź od Golang, a następnie, później złapać to samo w JavaScript przez Ajax.

Zmarnowane dużo czasu, więc zamieszczanie tutaj rozwiązania.

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

W JavaScript:

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

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

Nadzieja to pomaga kogoś.
Powodzenia.