Go yapısını JSON'a dönüştürme


181

jsonPaketi kullanarak JSON bir Go yapı dönüştürmek çalışıyorum ama tüm elde {}. Tamamen açık bir şey olduğundan eminim ama görmüyorum.

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

Sonra çalıştırmayı denediğimde bunu alıyorum:

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

Yanıtlar:


331

Sen gerek ihracatUser.name , böylece alanını jsonpaket görebilirsiniz. nameAlanı yeniden adlandırın 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))
}

Çıktı:

{"Name":"Frank"}

87
`json:"name"`Çıktı adını korumak için yapı alanı tanımının sonuna ekleyebileceğinizi unutmayın .
Dustin

12
Anlıyorum. Dili çok seviyorum ama sanırım bazı sözdizimsel unsurlar çok ileri gidiyor. Bir yapı üyesinin adı davranışı belirlerse, bu sadece yanlıştır.
magiconair

1
Peki, adın davranışı belirlemesi iyi veya kötü ise tartışılabilir :) ancak bir alanın başka bir yerde kontrol edilmesine gerek kalmadan ihraç edilip edilmediğini bilmeyi kolaylaştırır.
Olof

6
@magiconair: İlk runenin büyük harf kullanımı görünürlüğü belirler , "bir yapı üyesinin adı davranışı belirler" den çok daha makul bir fikirdir . Görünürlük meta verilerinin bir yerde saklanması ve bunu ifade etmek için sözdiziminin olması gerekir. Sonunda, ilk karakterin büyük harf kullanımını seçmenin en az ödünç alma ile en iyi şekilde çalıştığı belirlendi. Go1 sürümünden önce diğer planlar denendi ve reddedildi.
deft_code

11
O zamandan beri uzun bir yol katettim ve şimdi büyük harf kullanımı ile ihracat da dahil olmak üzere dili çok seviyorum.
magiconair

62

İlgili konu:

Yapıyı JSON'a dönüştürme konusunda sorun yaşıyordum, Golang'dan yanıt olarak gönderiyorum, sonra da Ajax aracılığıyla JavaScript'te aynı şeyi yakaladım.

Çok zaman harcadım, bu yüzden burada çözüm gönderiyoruz.

Hareket Halinde:

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

JavaScript'te:

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

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

Umarım bu birine yardımcı olur.
İyi şanslar.


6

Yapı değerleri JSON nesneleri olarak kodlanır. Dışa aktarılan her yapı alanı, aşağıdakiler olmadıkça nesnenin bir üyesi olur:

  • alanın etiketi "-" veya
  • alan boştur ve etiketi "omitempty" seçeneğini belirtir.

Boş değerler false, 0, herhangi bir nil işaretçisi veya arabirim değeri ve sıfır uzunluğundaki herhangi bir dizi, dilim, harita veya dizedir. Nesnenin varsayılan anahtar dizesi, yapı alanı adıdır, ancak yapı alanının etiket değerinde belirtilebilir. Yapı alanının etiket değerindeki "json" anahtarı, anahtar adıdır, bunu isteğe bağlı bir virgül ve seçenekler izler.


2

Kendi özel MarshalJSON ve UnmarshalJSON yöntemlerinizi tanımlayabilir ve nelerin dahil edilmesi gerektiğini kasıtlı olarak kontrol edebilirsiniz, örn:

package main

import (
    "fmt"
    "encoding/json"
)

type User struct {
    name string
}

func (u *User) MarshalJSON() ([]byte, error) {
    return json.Marshal(&struct {
        Name     string `json:"name"`
    }{
        Name:     "customized" + u.name,
    })
}

func main() {
    user := &User{name: "Frank"}
    b, err := json.Marshal(user)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(b))
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.