3 回答

TA貢獻1824條經(jīng)驗 獲得超5個贊
我認(rèn)為您嘗試生成的 JSON 不是有效的 JSON 對象,因此這可能是 JsonMarshal 不與您玩游戲的原因。
該對象可能無法通過 JavaScript 使用,因為它包含兩個對象,除非您將這些對象包裝在一個數(shù)組中。
[
{
"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條經(jīng)驗 獲得超14個贊
利用omitempty標(biāo)簽和一些邏輯,以便您可以使用單一類型為不同情況生成正確的輸出。
訣竅是知道 JSON 編碼器何時將值視為空。從 encoding/json 文檔:
空值是 false、0、任何 nil 指針或接口值,以及任何長度為零的數(shù)組、切片、映射或字符串。
這是您的程序稍作修改以產(chǎn)生您想要的輸出。當(dāng)某些字段的值為“空”時,它會省略某些字段 - 具體而言,JSON 編碼器將省略帶有“0”作為值的整數(shù)并使用零長度映射。
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 關(guān)注
- 353 瀏覽
添加回答
舉報