1 回答

TA貢獻1788條經驗 獲得超4個贊
使用聲明的類型,您可以實現json.Unmarshaler
接口以自定義 JSON 的解組方式。
{在實現中,您可以通過簡單地查看第一個和最后一個字節來查看它是-and-}還是[-and-來檢查 JSON 數據是否表示對象或數組]。根據該檢查,您可以決定如何進一步進行,下面是一個示例:
type Attr struct {
Type string
Value interface{}
}
type AttrList []Attr
func (ls *AttrList) UnmarshalJSON(data []byte) error {
if len(data) == 0 { // nothing to do
return nil
}
switch last := len(data)-1; {
// is array?
case data[0] == '[' && data[last] == ']':
return json.Unmarshal(data, (*[]Attr)(ls))
// is object?
case data[0] == '{' && data[last] == '}':
var obj map[string]interface{}
if err := json.Unmarshal(data, &obj); err != nil {
return err
}
for key, value := range obj {
*ls = append(*ls, Attr{Type: key, Value: value})
}
return nil
}
return errors.New("unsupported JSON type for AttrList")
}
https://go.dev/play/p/X5LV8G87bLJ
- 1 回答
- 0 關注
- 355 瀏覽
添加回答
舉報