Chuyển đổi cấu trúc Go sang JSON


181

Tôi đang cố gắng chuyển đổi cấu trúc Go sang JSON bằng cách sử dụng jsongói nhưng tất cả những gì tôi nhận được là {}. Tôi chắc chắn đó là một cái gì đó hoàn toàn rõ ràng nhưng tôi không nhìn thấy nó.

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

Sau đó, khi tôi cố chạy nó, tôi nhận được điều này:

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

Câu trả lời:


331

Bạn cần phải xuất khẩu các User.namelĩnh vực để các jsongói có thể nhìn thấy nó. Đổi tên namelĩnh vực thành 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))
}

Đầu ra:

{"Name":"Frank"}

87
Lưu ý rằng bạn có thể thêm `json:"name"`vào cuối định nghĩa trường cấu trúc để giữ nguyên tên đầu ra.
Dustin

12
Tôi hiểu rồi. Tôi hơi thích ngôn ngữ nhưng tôi nghĩ một số yếu tố cú pháp đi xa. Nếu tên của một thành viên cấu trúc xác định hành vi thì điều này chỉ sai.
magiconair

1
Chà, có tên xác định hành vi có thể được tranh luận nếu nó tốt hay xấu :) nhưng nó chắc chắn giúp bạn dễ dàng biết liệu một trường có được xuất hay không mà không phải kiểm tra ở nơi nào khác.
Olof

6
@magiconair: Viết hoa của rune đầu tiên xác định mức độ hiển thị , là một ý tưởng hợp lý hơn nhiều so với "tên của một thành viên cấu trúc xác định hành vi" . Siêu dữ liệu khả năng hiển thị cần được lưu trữ ở đâu đó và cần cú pháp để diễn đạt nó. Cuối cùng, người ta đã xác định rằng việc chọn cách viết hoa của char đầu tiên hoạt động tốt nhất với ít sự đánh đổi nhất. Trước khi phát hành Go1, các kế hoạch khác đã được thử và từ chối.
deft_code

11
Tôi đã đi một chặng đường dài và thích ngôn ngữ bao gồm xuất khẩu bằng cách viết hoa rất nhiều.
magiconair

62

Vấn đề liên quan:

Tôi đã gặp sự cố khi chuyển cấu trúc sang JSON, gửi nó dưới dạng phản hồi từ Golang, sau đó, sau đó bắt gặp điều tương tự trong JavaScript thông qua Ajax.

Lãng phí rất nhiều thời gian, vì vậy đăng giải pháp ở đây.

Trong Đi:

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

Trong JavaScript:

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

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

Hy vọng điều này sẽ giúp được ai đó.
May mắn nhất.


6

Các giá trị cấu trúc mã hóa dưới dạng các đối tượng JSON. Mỗi trường cấu trúc được xuất trở thành thành viên của đối tượng trừ khi:

  • thẻ của trường là "-" hoặc
  • trường trống và thẻ của nó chỉ định tùy chọn "omitempty".

Các giá trị trống là false, 0, bất kỳ con trỏ nào hoặc giá trị giao diện và bất kỳ mảng, lát, bản đồ hoặc chuỗi có độ dài bằng không. Chuỗi khóa mặc định của đối tượng là tên trường cấu trúc nhưng có thể được chỉ định trong giá trị thẻ của trường cấu trúc. Khóa "json" trong giá trị thẻ của trường cấu trúc là tên khóa, theo sau là dấu phẩy và tùy chọn tùy chọn.


2

Bạn có thể xác định các phương thức MarshalJSON và UnmarshalJSON tùy chỉnh của riêng bạn và cố ý kiểm soát những gì nên được đưa vào, ví dụ:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.