3 回答

TA貢獻1841條經驗 獲得超3個贊
使用自定義 json 取消封口方法創建切片類型。然后,在該解編中,您可以檢測您擁有的輸入類型,并相應地執行操作。此方法在我的視頻 Go 中的高級 JSON 處理中進一步詳細說明。
type Signs []Sign
func (s *Signs) UnmarshalJSON(d []byte) error {
if d[0] == '{' {
// We know it's a single object
var v Sign
err := json.Unmarshal(d, &v)
*s = Signs{v}
return err
}
// Otherwise it's an array
var v []Sign
err := json.Unmarshal(d, &v)
*s = Signs(v)
return err
}

TA貢獻1802條經驗 獲得超4個贊
可以通過實現自定義取消封口程序,在完全沒有(或類型斷言)的情況下執行此操作。我會通過窺視JSON內部并檢查它是否以方括號或大括號開頭來實現取消元帥...跳過空格。interface{}
請參閱 json。文檔中的解封接口。
type Document struct {
Sign SignList
}
type SignList []Sign
func (l *SignList) UnmarshalJSON(d []byte) error {
for _, b := range d {
switch b {
// These are the only valid whitespace in a JSON object.
case ' ', '\n', '\r', '\t':
case '[':
return json.Unmarshal(d, (*[]Sign)(l))
case '{':
var obj Sign
if err := json.Unmarshal(d, &obj); err != nil {
return err
}
*l = []Sign{obj}
return nil
default:
return errors.New("sign must be object or list")
}
}
return errors.New("sign must be object or list")
}
這似乎有點笨拙。哦,好吧。除了編碼/json 之外,還有用于 Go 的替代 JSON 取消編組庫。如果您愿意,請嘗試使用替代的 JSON 庫。此代碼僅適用于編碼/json。
下面介紹如何測試此代碼是否正常工作:
package main
import (
"fmt"
"encoding/json"
"errors"
)
type Sign struct {
X int
}
func main() {
cases := []string {
`{"Sign": {"X": 1}}`,
`{"Sign": [{"X": 1}, {"X": 2}]}`,
}
for _, c := range cases {
var doc Document
if err := json.Unmarshal([]byte(c), &doc); err != nil {
fmt.Println("Error:", err)
continue
}
fmt.Printf("Document: %+v\n", &doc)
}
}
打印如下:
Document: &{Sign:[{X:1}]}
Document: &{Sign:[{X:1} {X:2}]}

TA貢獻1775條經驗 獲得超11個贊
實現一個可以驗證數據的類型進行測試,并將其用作檢查。
例如:
package main
type SignTest struct {
Sign map[string]interface{} `json:"sign"`
}
func main() {
s := `{
"sign": [
{
"page_no": 1,
"x_coord": 100,
"y_coord": 300
},
{
"page_no": 2,
"x_coord": 200,
"y_coord": 400
}
]
}`
err := json.Unmarshal([]byte(s), &SignTest{})
if err != nil {
fmt.Println("Document Type")
} else {
fmt.Println("Sign Type")
}
}
打印 ,而Document Type
package main
type SignTest struct {
Sign map[string]interface{} `json:"sign"`
}
func main() {
s := `{
"sign": {
"page_no": 1,
"x_coord": 100,
"y_coord": 300
}
}`
err := json.Unmarshal([]byte(s), &SignTest{})
if err != nil {
fmt.Println("Document Type")
} else {
fmt.Println("Sign Type")
}
}
指紋。Sign Type
但是,在取消編組符號以外的對象是否是數組時,這里可能會出錯,如果您想要更安全,請檢查錯誤的錯誤消息,該錯誤應按預期方式假設為 。Document
- 3 回答
- 0 關注
- 123 瀏覽
添加回答
舉報