2 回答
TA贡献2003条经验 获得超2个赞
检查 JSON 文档中的第一个非空白字节以确定文档是数组还是对象。
func decodeArrayOrObject(doc []byte) ([]map[string]json.RawMessage, error) {
trimmedDoc := bytes.TrimSpace(doc)
switch {
case len(trimmedDoc) == 0:
return nil, errors.New("empty body")
case trimmedDoc[0] == '{':
var m map[string]json.RawMessage
err := json.Unmarshal(doc, &m)
return []map[string]json.RawMessage{m}, err
case trimmedDoc[0] == '[':
var s []map[string]json.RawMessage
err := json.Unmarshal(doc, &s)
return s, err
default:
return nil, errors.New("unexpected type")
}
}
使用reflect包创建一个适用于任意切片类型的函数:
func decodeArrayOrObject(doc []byte, slicep interface{}) error {
trimmedDoc := bytes.TrimSpace(doc)
switch {
case len(trimmedDoc) == 0:
return errors.New("empty document")
case trimmedDoc[0] == '[':
return json.Unmarshal(doc, slicep)
case trimmedDoc[0] == '{':
s := reflect.ValueOf(slicep).Elem()
s.Set(reflect.MakeSlice(s.Type(), 1, 1))
return json.Unmarshal(doc, s.Index(0).Addr().Interface())
default:
return errors.New("unexpected type")
}
}
使用指向结构切片的指针或指向结构指针切片的指针调用函数。
var v []Example
err := decodeArrayOrObject(body, &v)
TA贡献1856条经验 获得超11个赞
不确定是惯用的,但这段代码可以作为一个例子。
简而言之,您可以尝试以一种格式解组,如果失败,则以另一种格式解组
关键功能是
func parseStr(data string) ([]Item, error) {
item := Item{}
if err := json.Unmarshal([]byte(data), &item); err == nil {
return []Item{item}, nil
}
items := []Item{}
if err := json.Unmarshal([]byte(data), &items); err != nil {
return nil, errors.New("invalid JSON data")
}
return items, nil
}
- 2 回答
- 0 关注
- 133 浏览
添加回答
举报