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

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

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". Но здесь в первую очередь анализируются поля внутренней структуры.

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

colm.anseo 10.04.2019 05:01

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

Flimzy 10.04.2019 08:20

Отражение полей структуры "Root" должно происходить первым, а затем остальные поля. Поскольку «Root» является родительской структурой и дочерней во «Inner».

Hemanth Savasere 11.04.2019 07:47
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
0
3
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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":""}

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

Hemanth Savasere 11.04.2019 07:51

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

colm.anseo 12.04.2019 00:52

Другие вопросы по теме