การแปลงโครงสร้างของคุณเป็น JSON


181

ฉันพยายามที่จะแปลง struct ไป JSON ใช้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))
}

จากนั้นเมื่อฉันพยายามเรียกใช้ฉันจะได้รับสิ่งนี้:

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

คำตอบ:


331

คุณจำเป็นต้องส่งออกUser.nameฟิลด์เพื่อให้jsonแพคเกจที่สามารถมองเห็นได้ เปลี่ยนชื่อสนามnameName

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

เอาท์พุท:

{"Name":"Frank"}

87
โปรดทราบว่าคุณสามารถเพิ่ม`json:"name"`ที่ส่วนท้ายของนิยามฟิลด์โครงสร้างเพื่อรักษาชื่อเอาต์พุต
ดัสติน

12
ฉันเห็น. ฉันชอบภาษา แต่ฉันคิดว่าองค์ประกอบด้านไวยากรณ์บางอย่างไปไกล หากชื่อของสมาชิกโครงสร้างกำหนดพฤติกรรมแล้วนี่เป็นเพียงความผิด
magiconair

1
การมีชื่อกำหนดว่าพฤติกรรมสามารถถกเถียงกันว่ามันดีหรือไม่ดี :) แต่แน่นอนว่าทำให้ง่ายต่อการทราบว่าฟิลด์ถูกเอ็กซ์พอร์ตหรือไม่โดยไม่ต้องตรวจสอบที่อื่น
Olof

6
@magiconair: พิมพ์ใหญ่ของคาถาแรกที่กำหนดการมองเห็น , เป็นความคิดที่เหมาะสมมากขึ้นกว่า"ชื่อของสมาชิก struct ที่กำหนดลักษณะการทำงาน" เมตาดาต้าการมองเห็นจะต้องเก็บไว้ที่ไหนสักแห่งและต้องการไวยากรณ์เพื่อแสดงมัน ในที่สุดมันก็ถูกกำหนดว่าการเลือกใช้ตัวพิมพ์ใหญ่ของถ่านตัวแรกจะทำงานได้ดีที่สุดกับการแลกเปลี่ยนที่น้อยที่สุด ก่อนที่จะปล่อย Go1 แผนการอื่น ๆ ได้พยายามและปฏิเสธ
deft_code

11
ฉันมาไกลและชอบภาษารวมถึงการส่งออกโดยใช้อักษรตัวใหญ่มากตอนนี้
magiconair

62

ปัญหาที่เกี่ยวข้อง:

ฉันมีปัญหาในการแปลง struct เป็น JSON โดยส่งเป็นคำตอบจาก Golang หลังจากนั้นก็จับจาวาสคริปต์ผ่าน Ajax

เสียเวลามากดังนั้นการโพสต์โซลูชันที่นี่

ในระหว่างเดินทาง:

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

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

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

หวังว่านี่จะช่วยใครซักคน
ขอให้โชคดี


6

ค่าโครงสร้างเข้ารหัสเป็นวัตถุ JSON แต่ละเขตข้อมูล struct ที่ส่งออกจะกลายเป็นสมาชิกของวัตถุยกเว้น:

  • แท็กของฟิลด์คือ "-" หรือ
  • ฟิลด์ว่างเปล่าและแท็กระบุตัวเลือก "ละเว้น"

ค่าที่ว่างเปล่าคือ false, 0, ตัวชี้ใด ๆ หรือค่าอินเทอร์เฟซใด ๆ และอาเรย์ชิ้นส่วนแผนที่หรือสตริงความยาวเป็นศูนย์ใด ๆ สตริงคีย์เริ่มต้นของวัตถุคือชื่อฟิลด์ struct แต่สามารถระบุได้ในค่าแท็กของฟิลด์ struct คีย์ "json" ในค่าแท็กของฟิลด์ struct คือชื่อคีย์ตามด้วยเครื่องหมายจุลภาคและตัวเลือกเพิ่มเติม


2

คุณสามารถกำหนดวิธีการ MarshalJSON และ UnmarshalJSON ของคุณเองและจงใจควบคุมสิ่งที่ควรรวมไว้เช่น:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.