2 回答

TA貢獻(xiàn)1862條經(jīng)驗 獲得超7個贊
您真正想要的是 JSON 編碼的自定義方式Term。它不是一個簡單的地圖,而是像一個包含地圖的對象一樣進(jìn)行編組。所以,讓我們MarshalJSON為它編寫這個習(xí)慣:
type Term map[string]interface{}
func (t Term) MarshalJSON() ([]byte, error) {
return json.Marshal(struct {
T map[string]interface{} `json:"term"`
}{t})
}
我們struct在這里創(chuàng)建一個匿名的,用我們自己填充,然后將其編組為 JSON。注意map[string]interface{}這里的使用。雖然看起來像Term,但它實際上是一種不同的類型,具有自己的 JSON 編碼方式。如果您嘗試在此處保存一些輸入并使用T Term,您會發(fā)現(xiàn)自己處于無限循環(huán)中。(創(chuàng)建與其他類型具有相同結(jié)構(gòu)的新類型的想法是 Go 的主要部分。)
現(xiàn)在我們的數(shù)據(jù)結(jié)構(gòu)很簡單;只是一部分術(shù)語:
type Filter struct {
And []Term `json:"and"`
}
func main() {
var filter Filter
filter.And = append(filter.And, Term{"name.second" : "ba"})
jsonFilter, _ := json.MarshalIndent(filter, "", " ")
fmt.Printf(string(jsonFilter))
}
也就是說,您也可以走另一條路,讓您的數(shù)據(jù)模型與 JSON 更緊密地匹配。在那種情況下Term應(yīng)該是一個結(jié)構(gòu),而不是一個地圖。你可能會這樣寫:
type Term struct {
Values map[string]interface{} `json:"term"`
}
func NewTerm(key, value string) Term {
return Term{map[string]interface{}{key: value}}
}
type Filter struct {
And []Term `json:"and"`
}
func main() {
var filter Filter
filter.And = append(filter.And, NewTerm("name.second", "ba"))
jsonFilter, _ := json.MarshalIndent(filter, "", " ")
fmt.Printf(string(jsonFilter))
}

TA貢獻(xiàn)1796條經(jīng)驗 獲得超4個贊
您可以圍繞它創(chuàng)建一個包裝函數(shù)。
package main
import (
"fmt"
"encoding/json"
)
type Filter struct {
And []map[string]interface{} `json:"and"`
}
func WrapFilter(i interface{}) Filter {
return Filter{
And: []map[string]interface{}{
map[string]interface{}{
"term": i,
},
},
}
}
func main() {
f := WrapFilter(map[string]string{"name.second": "ba"})
json.Marshal(f)
}
這樣,您將始終"term"在編組的 JSON 中擁有二級密鑰。
- 2 回答
- 0 關(guān)注
- 159 瀏覽
添加回答
舉報