ChatGPT解决这个技术问题 Extra ChatGPT

将 Go 结构转换为 JSON

我正在尝试使用 json 包将 Go 结构转换为 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 
{}

v
vimdude

您需要 export User.name 字段,以便 json 包可以看到它。将 name 字段重命名为 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))
}

输出:

{"Name":"Frank"}

请注意,您可以将 `json:"name"` 添加到结构字段定义的末尾以保留输出名称。
我懂了。我有点喜欢这种语言,但我认为一些句法元素走得太远了。如果结构成员的名称决定了行为,那么这是错误的。
好吧,让名称决定行为是好是坏可以争论:) 但它确实可以很容易地知道一个字段是否被导出,而无需检查其他地方。
@magiconair:第一个符文的大写决定了可见性,这是一个比“结构成员的名称决定行为”更合理的想法。可见性元数据需要存储在某个地方,并且需要语法来表达它。最终确定,选择第一个 char 的大写形式效果最好,而且折衷最少。在 Go1 发布之前,其他方案被尝试并被拒绝。
从那以后我已经走了很长一段路,现在非常喜欢包括大写输出在内的语言。
p
pixel

相关问题:

我在将 struct 转换为 JSON 时遇到问题,将其作为来自 Golang 的响应发送,然后,稍后通过 Ajax 在 JavaScript 中捕获相同的内容。

浪费了很多时间,所以在这里发布解决方案。

在围棋中:

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

这会写入首字母大写的 json。如何以小写形式编写 json 字符串?编辑:确保包括引号大声笑。叹。
A
Andrew

结构值编码为 JSON 对象。每个导出的结构字段都成为对象的成员,除非:

该字段的标签是“-”,或

该字段为空,其标签指定“omitempty”选项。

空值是 false、0、任何 nil 指针或接口值,以及任何长度为零的数组、切片、映射或字符串。对象的默认键字符串是结构字段名称,但可以在结构字段的标记值中指定。结构字段标签值中的“json”键是键名,后跟可选的逗号和选项。


H
Hieu Vo

您可以定义自己的自定义 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))
}


d
demented hedgehog

这是一个有趣的问题,使用新的 go 版本非常容易。你应该做这个:

package main

import (
    "fmt"
    "encoding/json"
)

type User struct {
    Name string `json:"name"`
}

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

将此名称更改为名称。