Как маршалить одну и туже структуру в json с разным набором полей?

В языке программирования Go маршалинг структур в JSON выполняется с помощью пакета encoding/json. Если у вас есть структура и вы хотите маршалировать ее в JSON с разным набором полей в зависимости от сценария, вы можете воспользоваться несколькими подходами.

1. Использование тегов json: В Go структуры могут содержать теги, которые указывают на то, какие поля следует маршалировать и десериализовать. Вы можете добавить теги json к полям вашей структуры, чтобы управлять маршалированием. Например:

type MyStruct struct {
    Field1 string `json:"field1"`
    Field2 string `json:"field2,omitempty"`
}

В этом примере поле Field1 всегда будет маршалироваться, а поле Field2 будет маршалироваться только тогда, когда оно не пустое (т.е. будет пропущено, если оно имеет значение по умолчанию).

2. Использование interface{}: Если вы хотите динамически маршалировать разные наборы полей, то можно использовать interface{} для представления отдельных полей или набора полей. В вашей структуре вы можете использовать поле типа interface{} и применять приведение типов при маршалировании. Например:

type MyStruct struct {
    Field1 interface{} `json:"field1"`
    Field2 interface{} `json:"field2"`
}

Затем вы можете присвоить различные значения этим полям, в зависимости от того, какие поля вам нужно маршалировать. Например:

myStruct := MyStruct{
    Field1: "value1",
    Field2: map[string]interface{}{
        "nestedField1": "value2",
        "nestedField2": "value3",
    },
}

3. Использование map[string]interface{}: Если у вас есть динамический набор полей для маршалирования, вы можете использовать map[string]interface{} для представления структуры данных. Вместо создания фиксированной структуры вы можете создать карту, в которой ключи представляют имена полей, а значения представляют значения полей. Например:

data := map[string]interface{}{
    "field1": "value1",
    "field2": "value2",
}

Затем вы можете маршалировать эту карту в JSON с помощью json.Marshal():

jsonData, err := json.Marshal(data)
if err != nil {
    // обработка ошибки
}

В итоге получаем JSON строку, которая представляет собой маршалированные значения полей.

Независимо от выбранного подхода для маршалирования в JSON с разным набором полей, вы можете использовать функцию json.Marshal() для того, чтобы преобразовать ваш объект в JSON-представление. Если вам нужно выполнить обратный процесс (десериализацию), то вы можете использовать функцию json.Unmarshal().