Как мне убедиться, что сначала анализируются файлы корневой структуры, а затем анализируются поля встроенной структуры

#go #struct

#Вперед #struct

Вопрос:

У меня есть структура следующим образом:-

 type Inner struct {
    FooInner string `json:"fooInner"`
    BarInner string `json:"barInner,omitempty"`
}

type Root struct {
    Inner
    Foo string `json:"foo"`
    Bar string `json:"bar"`
}
  

Я хочу, чтобы сначала были проанализированы поля «корневой» структуры, а затем поля «внутренней» структуры. Но здесь сначала анализируются поля внутренней структуры.

Комментарии:

1. Документ JSON определяет порядок полей. Итак, я предполагаю, что вы спрашиваете о маршалировании JSON (не синтаксическом анализе) и хотите, чтобы сначала были маршалированы корневые поля перед внутренним?

2. Структуры не анализируются. Они уже в нормализованной форме. Так что я не уверен, о чем вы спрашиваете.

3. Сначала должно произойти отражение полей «корневой» структуры, а затем других полей. Поскольку «Root» является родительской структурой, а дочерний элемент — «Внутренним».

Ответ №1:

Если вы спрашиваете о маршалировании 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":""}
  

Комментарии:

1. Есть ли какой-либо другой способ, с помощью которого я могу заставить встроенную структуру наконец анализироваться, а не сначала анализироваться.

2. Вам нужно будет написать свой собственный маршаллер, чтобы сначала отдавать предпочтение локальным полям, прежде чем возвращаться к встроенным структурам. Но зачем вам это нужно? Это прекрасно, перечисляя поля в вашем коде в том порядке, в котором вы хотите, чтобы они были упорядочены.