Простой подход состоит в том, чтобы проанализировать документ JSON как interface{}
(«любой тип») и получить целевое значение строки путем утверждения проанализированной структуры. Например (игровая площадка) :
func main() {
str := GetTargetString([]byte(jsonstr))
fmt.Println(str) // => "Odio los lunes"
}
func GetTargetString(bs []byte) string {
var doc interface{}
if err := json.Unmarshal(bs, &doc); err != nil {
panic(err)
}
return doc.([]interface{})[0].([]interface{})[0].([]interface{})[0].(string)
}
Функция «GetTargetString» будет паниковать, если данный фрагмент байта не содержит допустимый документ JSON или если структура документа не достаточно похожа (то есть массив, первый элемент которого является массивом, первый элемент которого массив, первый элемент которого является строкой).
Более идиоматическим (и в целом более безопасным) подходом будет проверка типов с использованием специальной формы с двумя возвращаемыми значениями утверждения типа и возвращение кортежа (string, error)
, например ::
.
if err := json.Unmarshal(jsonString, &result); err != nil {
return "", err
}
array0, ok := doc.([]interface{})
if !ok {
return "", fmt.Errorf("JSON document is not an array")
}
array1, ok := array0[0].([]interface{})
if !ok {
return "", fmt.Errorf("first element is not an array")
}
// ...