Я учусь, написав простой HTTP-сервер, и мне нужно обработать некоторые ответы JSON.Unmarshalling массив верхнего уровня JSON в Go
С ответом объекта, я могу распаковать его идиоматически 2 строки кода: structResult: = Foo {} json.Unmarshal (structBody, & structResult)
Я не знаю, как сделать то же самое для ответа массива (см. пример ниже). Есть ли способ указать (возможно, через тег json), что массив верхнего уровня должен перейти в заданное поле структуры?
package main
import "fmt"
import "encoding/json"
type Foo struct {
Id uint64 `json:"id"`
Name string `json:"name"`
}
type BaseResult struct {
Error string `json:"error"`
}
type FooResult struct {
BaseResult
Foos []Foo
}
func main() {
// Simple and works.
structBody := []byte(`{"id": 1,"name": "foo"}`)
structResult := Foo{}
json.Unmarshal(structBody, &structResult)
fmt.Printf("%#v\n", structResult)
// Doesn't work.
arrayBody := []byte(`[{"id": 1,"name": "foo"},{"id": 2,"name": "bar"},{"id": 3,"name": "foobar"}]`)
arrayResult := FooResult{}
json.Unmarshal(arrayBody, &arrayResult)
fmt.Printf("%#v\n", arrayResult)
}
Я знаю, что я мог бы сделать FooResult массив:
type FooResult []Foo
но тогда я теряю способность определить базовый объект, который я хотел бы использовать для хранения сообщений об ошибках и тому подобное. Я также знаю, что я могу отменить в & fooResult.Foos напрямую, но я хочу, чтобы код работал как с объектами, так и с массивами.
UPDATE
Внедрение UnmarshalJSON как это было предложено @dyoo частично решает мою проблему, но я надеялся, что я мог бы использовать для хранения BaseResult Ошибка синтаксического анализа в случае JSON имеет другую структуру:
arrayBody := []byte(`{"error": "foo"}`)
arrayResult := FooResult{}
json.Unmarshal(arrayBody, &arrayResult)
fmt.Printf("%#v\n", arrayResult)
Of Конечно, я мог бы внедрить более сложную логику внутри UnmarshalJSON - но разве нет более простого способа сделать это?
Рекомендация: переименовать '' FooResult' к ArrayResult'. Использование 'Foo', поскольку любая часть имени часто сомнительна, потому что это ничего не значит. – dyoo
Конечно, в этом примере я использовал имя «foo». – proxi