Вариант по умолчанию для go json marshal? - PullRequest
0 голосов
/ 20 марта 2019

У меня есть следующие структуры для экспорта в json:

type ExportedIncident struct {
    Title      string `json:"title"`
    Host       string `json:"host"`
    Status     string `json:"status"`
    Date       string `json:"date"`
    Notes      []ExportedNote `json:"notes"`
    LogEntries []ExportedLogEntry `json:"log_entries"`
}

И я хочу подчеркнуть поля в регистре, поэтому я должен был определить каждое поле только для этого, как описано в этом ответе: https://stackoverflow.com/a/11694255/1731473

Но это действительно громоздко, и я считаю, что в Go есть более простое решение, но я не могу его найти.

Как установить регистр букв по умолчанию (подчеркивание, змея, верблюд ...) для экспорта в формате JSON?

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Как упоминал @Vovimir Kovpak, вы не можете сделать это со стандартной библиотекой, по крайней мере, на данный момент.


Хотя, вдохновленный этим , вы можетедостичь чего-то близкого к тому, что вы хотите сделатьВыезд MarshalIndentSnakeCase:

func MarshalIndentSnakeCase(v interface{}, prefix, indent string) ([]byte, error) {
    b, err := json.MarshalIndent(v, prefix, indent)
    if err != nil {
        return nil, err
    }

    x := convertKeys(b) // Here convert all keys from CamelCase to snake_case

    buf := &bytes.Buffer{}
    err = json.Indent(buf, []byte(x), prefix, indent)
    if err != nil {
        return nil, err
    }

    return buf.Bytes(), nil
}

Вниз:

  • Вы должны сделать то же самое в противоположном направлении, чтобы Unmashalling работал.
  • Порядокэлементов теряется из-за использования map внутри convertKeys().

Попробуйте на Go Playground .

1 голос
/ 20 марта 2019

К сожалению, нет возможности экспортировать ваши поля в snake_case, поэтому вы должны сами поддерживать теги.

Технически вы можете использовать метод MarshalJSON и выполнять все манипуляции внутри этого метода, но это не так.не проще ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...