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 关注
- 334 浏览
添加回答
举报