Выполните пошаговый анализ вашего JSON, используя json.Decoder
. Это имеет преимущество перед другими ответами:
- Быть более эффективным, чем декодировать все значение
- Использование официальных правил синтаксического анализа JSON и генерация стандартных ошибок, если вы получили неверный ввод.
Обратите внимание, этот код не тестировался, но его должно быть достаточно, чтобы дать вам идею. При желании его также можно легко развернуть для проверки чисел, логических значений или строк.
type jsonType(in io.Reader) (string, error) {
dec := json.NewDecoder(in)
// Get just the first valid JSON token from input
t, err := dec.Token()
if err != nil {
return "", err
}
if d, ok := t.(json.Delim); ok {
// The first token is a delimiter, so this is an array or an object
switch (d) {
case "[":
return "array", nil
case "{":
return "object", nil
default: // ] or }
return nil, errors.New("Unexpected delimiter")
}
}
return nil, errors.New("Input does not represent a JSON object or array")
}
Обратите внимание, что потребляет первые несколько байтов in
. Это упражнение для читателя сделать копию, если это необходимо. Если вы пытаетесь читать из байтового фрагмента ([]byte
), сначала преобразуйте его в считыватель:
t, err := jsonType(bytes.NewReader(myValue))