Имеет ли значение регистр имени поля JSON при выполнении Marshal и Unmarshal?

Функции Marshal и Unmarshal строго чувствительны к регистру?

Следующая структура определяет билет:

    type TicketInfo struct {
         TicketKey                  string `json:"ticketKey"`       
         Ticketextnum               string `json:"ticketextnum"`        
         TicketDate                 string `json:"ticketDate"`      
         TicketDesc                 string `json:"ticketDesc"`
    }       

Эта строковая форма этого json будет передана как единственный параметр в полезной нагрузке вызова API исходными системами. Что произойдет, если исходная система отправит, например, «TicketKey» вместо «ticketKey» для первого поля. Правильно ли получил json.Marshal поле ticketKey?

From: golang.org/pkg/encoding/json/#Unmarshal «Чтобы демаршалировать JSON в структуру, Unmarshal сопоставляет входящие ключи объекта с ключами, используемыми Marshal (либо имя поля структуры, либо его тег), предпочитая точное совпадение, но также принимая совпадение без учета регистра». Вы должны сначала прочитать полную документацию. Затем вам следует провести эксперимент, например, изменив приведенные примеры. Затем спроси.

Volker 31.10.2018 09:23
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
6
1
474
1

Ответы 1

На это легко ответить чтение документов или простой тест. Но, в частности, см. Эти примечания (курсив добавлен) для Маршал:

Struct values encode as JSON objects. Each exported struct field becomes a member of the object, using the field name as the object key, unless the field is omitted for one of the reasons given below.

The encoding of each struct field can be customized by the format string stored under the "json" key in the struct field's tag. The format string gives the name of the field, possibly followed by a comma-separated list of options. The name may be empty in order to specify options without overriding the default field name.

и Unmarshal:

To unmarshal JSON into a struct, Unmarshal matches incoming object keys to the keys used by Marshal (either the struct field name or its tag), preferring an exact match but also accepting a case-insensitive match. By default, object keys which don't have a corresponding struct field are ignored (see Decoder.DisallowUnknownFields for an alternative).

Итак, TL; DR; для маршалинга регистр соблюдается точно, а для демаршалинга предпочтительнее точный регистр с откатом к совпадению без учета регистра.

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