У меня есть следующая структура: -
type Inner struct {
FooInner string `json:"fooInner"`
BarInner string `json:"barInner,omitempty"`
}
type Root struct {
Inner
Foo string `json:"foo"`
Bar string `json:"bar"`
}
Я хочу, чтобы сначала анализировались поля структуры "Root", а затем поля структуры "Inner". Но здесь в первую очередь анализируются поля внутренней структуры.
Структуры не анализируются. Они уже в нормализованной форме. Так что я не уверен, что вы спрашиваете.
Отражение полей структуры "Root" должно происходить первым, а затем остальные поля. Поскольку «Root» является родительской структурой и дочерней во «Inner».
Если вы спрашиваете о маршалинге JSON (который не является синтаксическим анализом) и хотите, чтобы поля были маршалированы в определенном порядке, маршалер обычно маршалирует поля в порядке их индекса и рекурсивно выполняет любые встроенные структуры по пути. Индексы полей структуры, как видно из пакета reflect
, который использует json.Marhsal
, определяются порядком их появления в вашем коде.
Итак, сначала поместите нужные поля, а затем любые встроенные структуры:
type Root struct {
Foo string `json:"foo"`
Bar string `json:"bar"`
Inner // <- move this last
}
Детская площадка Пример
b, _ := json.Marshal(Root{})
{"foo":"","bar":"","fooInner":""}
Есть ли какой-либо другой способ, с помощью которого я могу сделать встроенную структуру для окончательного анализа, а не для первого анализа.
Вам придется написать свой собственный маршаллер, чтобы сначала предпочесть локальные поля, прежде чем рекурсивно использовать встроенные структуры. Но зачем вам это нужно? Совершенно нормально перечислять поля в вашем коде в том порядке, в котором вы хотите, чтобы они были маршалированы.
Документ JSON определяет порядок полей. Итак, я предполагаю, что вы спрашиваете о маршалировании JSON (не разбор) и хотите, чтобы корневые поля были маршалированы первыми перед внутренними?