3 回答
TA贡献1824条经验 获得超5个赞
我认为您尝试生成的 JSON 不是有效的 JSON 对象,因此这可能是 JsonMarshal 不与您玩游戏的原因。
该对象可能无法通过 JavaScript 使用,因为它包含两个对象,除非您将这些对象包装在一个数组中。
[
{
"id": 123,
"name": "James Dean",
"_links": {
"self": "http://user/123"
}
},
{
"id": 456,
"userId": 123,
"_links": {
"self": "http://session/456"
}
}
]
然后你就可以使用这个 JSON,例如:
var user, session;
user = jsonString[0];
session = jsonString[1];
考虑给你的对象根名称可能是一个更好的考虑,例如:
{
"user": {
"id": 123,
"name": "James Dean",
"_links": {
"self": "http://user/123"
}
},
"session": {
"id": 456,
"userId": 123,
"_links": {
"self": "http://session/456"
}
}
}
并消耗为,例如:
var user, session;
user = jsonString.user;
session = jsonString.session;
我希望这可以帮助你
TA贡献1817条经验 获得超14个赞
利用omitempty标签和一些逻辑,以便您可以使用单一类型为不同情况生成正确的输出。
诀窍是知道 JSON 编码器何时将值视为空。从 encoding/json 文档:
空值是 false、0、任何 nil 指针或接口值,以及任何长度为零的数组、切片、映射或字符串。
这是您的程序稍作修改以产生您想要的输出。当某些字段的值为“空”时,它会省略某些字段 - 具体而言,JSON 编码器将省略带有“0”作为值的整数并使用零长度映射。
package main
import (
"encoding/json"
"fmt"
)
type User struct {
Id int `json:"id"`
Name string `json:"name,omitempty"`
UserId int `json:"userId,omitempty"`
Links map[string]string `json:"_links,omitempty"`
}
func Marshal(u *User) ([]byte, error) {
u.Links = make(map[string]string)
if u.UserId != 0 {
u.Links["self"] = fmt.Sprintf("http://user/%d", u.UserId)
} else if u.Id != 0 {
u.Links["self"] = fmt.Sprintf("http://session/%d", u.Id)
}
return json.MarshalIndent(u, "", " ")
}
func main() {
u := &User{Id: 123, Name: "James Dean"}
s := &User{Id: 456, UserId: 123}
json, err := Marshal(u)
if err != nil {
panic(err)
} else {
fmt.Println(string(json))
}
json, err = Marshal(s)
if err != nil {
panic(err)
} else {
fmt.Println(string(json))
}
}
- 3 回答
- 0 关注
- 310 浏览
添加回答
举报