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 關注
- 155 瀏覽
添加回答
舉報