Ключові імена JSON з малих літер з маршалом JSON в компанії Go


175

Я хочу використати "encoding/json"пакет для маршалювання структури, оголошеної в одному з імпортованих пакетів моєї заявки.

Напр .:

type T struct {
    Foo int
}

Оскільки він імпортується, усі доступні (експортовані) поля в структурі починаються з великої літери. Але я хочу мати невеликі ключові імена:

out, err := json.Marshal(&T{Foo: 42})

призведе до

{"Foo": 42}

але я хочу отримати

{"foo": 42}

Чи можна подолати проблему якимсь простим способом?


5
@ Zippoxer: Я б сказав: ключ у протоколі зв'язку клієнт / сервер, строго визначений для малих літер. Ну, в моєму випадку це не має значення, оскільки я сам визначив протокол .. але принаймні теоретично? Але я знаю, що в основному я просто витрачаю занадто багато часу на дурні дрібниці.
ANisus

Не вибачайтесь. Ви не дурні, мова, яка не приймає повну специфікацію json, є дурною (хоча питання легко вирішується, як нижче).
Jehan

@ANisus: Я неправильно прочитав ваше запитання щодо імен ключових структур, а не імен ключів JSON. Відкликали голосування.
Flimzy

Відповіді:


265

Погляньте на документи для кодування / json.Marshal . Він обговорює використання тегів структури stru, щоб визначити, як формується створений json.

Наприклад:

type T struct {
    FieldA int    `json:"field_a"`
    FieldB string `json:"field_b,omitempty"`
}

Це призведе до отримання JSON таким чином:

{
    "field_a": 1234,
    "field_b": "foobar"
}

8
Польові теги? О мій .. Я пропустив всю цю частину під час пошуку в документах. Я шукав прапори, функції чи якісь інші налаштування. Ну, це точна відповідь, яку я шукав! А крім того, у мене є нова концепція Go, щоб дізнатися про: теги поля :)
ANisus

Вони досить зручні. Ви можете отримати доступ до них під час виконання через reflectпакет.
jimt

Так, під час роботи з роздумом я бачу, як можливість додавання метаданих у поле може бути чудовою справою! Btw, просто спробував відповідь. Працює як шарм.
ANisus

5
Я щойно почав лаяти мову - як це нерозумно, чому вони роблять поля з малих літер у створеному JSON тощо, і т. Д. Потім я натрапив на цю тему і подумав "OMG Це геніально !!!". Я навіть стрибнув і пояснив своїй дівчині, чому я так схвильований: D Це так круто :)))
nyxz

11
Переконайтесь, що між двокрапкою та першим лапкою тегу немає місця! Використовуйте json:"some_tag"замість json: "some_tag". Мене на цьому трохи покусали.
Девід Моралес

8

Ви можете зробити власну структуру за допомогою ключів, які потрібно експортувати, та надати їм відповідні теги json для малих імен. Потім ви можете скопіювати потрібну структуру у свою, перш ніж кодувати її як JSON. Або якщо ви не хочете турбуватися про створення локальної структури, ви, ймовірно, можете зробити map[string]interface{}і кодувати це.


Дурне в тому, що інший пакет (містить типи) насправді і мій. Але так, я, мабуть, сліпо дивився на те, що це має бути структура. Використання a map[string]interface{}буде працювати до тих пір, поки я не закінчую вкладеними об'єктами / структурами
ANisus

1
@ANisus: О, моя відповідь передбачала, що ти не контролюєш визначення структури. Відповідь Джита - це точно те, що ви хочете.
Лілі Баллард

Так, мені не було зрозуміло, чи це зовнішній пакет, чи ні. Але ваша відповідь все ще актуальна і корисна у випадках, коли ви не контролюєте визначення.
ANisus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.