Перетворити імена властивостей стилів JSON в імена Java CamelCase за допомогою GSON


106

Я використовую GSON для перетворення даних JSON, які я отримую до об’єкта Java. Це працює досить добре у всіх моїх тестах. Проблема полягає в тому, що наші реальні об’єкти мають деякі властивості, названі як is_online. GSON відображає їх лише в тому випадку, якщо вони названі абсолютно рівними, було б добре, щоб GSON перетворив імена в регістр Java верблюда isOnline.

Здається, це можливо під час створення даних JSON, випадок верблюда перетворюється на слова, виділені з підкреслення в JSON. Але я не можу знайти спосіб конкретизувати це навпаки.


5
Я б запропонував прийняти відповідь
JeanValjean

Відповіді:


313

Я встановив, що наступні налаштування працюють ідеально під час читання json з підкресленими атрибутами та використання верблюжних кожухів у моїх моделях.

Gson gson = new GsonBuilder()
    .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
    .create()

2
Чудова відповідь, дякую! @janusz, якщо будь-яка з цих відповідей вам допомогла, будь ласка, позначте їх як прийняту відповідь.
sufinawaz

1
Якщо у вас є випадок, коли ім'я містить два підкреслення, воно ігнорує перший підкреслення. Вих. this_key_has__two_underscores буде перетворено на thisKeyHas_TwoUnderscores і те саме навпаки. Ключовим моментом є FieldNamingPolicy, де enum говорить "нижній регістр" з підкресленням, тоді як тут перетворене ім'я має верхній регістр із підкресленням (_T).
Діпак Г.М.

Дуже просто, рятує мене від необхідності коментувати купу полів!
Вільям Т. Маллард

98

Ви можете використовувати SerializedNameпримітку:

@SerializedName("field_name_in_json")
private final String fieldNameInJava;

Примітка. Коли ви вже встановили FieldNamingPolicy, SerializedNameзамінять його налаштування для цього конкретного поля (досить зручно для особливих випадків).


2

Майте на увазі, що ваш приклад є кращим випадком. Якщо у вас є властивість "foo", його getter має бути названий "getFoo", а якщо у вас є властивість під назвою "foo_bar", його getter має бути названо "getFooBar", однак у вашому прикладі ви відображаєте булеві та булеві Конвенції про найменування конкретних випадків у java. Первісна булева властивість, названа в Інтернеті, повинна мати геттер з назвою "isOnline", а не "getOnline" або ще гірше, "getIsOnline". Буловий об'єкт обгортки (тобто Boolean) не повинен слідувати за цим особливим випадком, а у властивості під назвою "он-лайн" має бути геттер з назвою "getOnline".

Отже, наявність булевих властивостей з "є" в назві є кращим випадком, де ви хочете викреслити саме цей префікс під час конверсії. У зворотному напрямку ваш код може захотіти перевірити об'єкт json як для імені сировини, так і для версії 'is_XXX'.


2

Я думаю , що ви хочете тут . Використовуючи примітки, ви можете сказати GSON, що mySuperCoolField насправді в JSON називається this_field_is_fun, і він буде розпаковувати його правильно. Принаймні, я думаю, що це працює і для десеріалізації.

Якщо це не працює, ви можете використовувати власні JsonSerializer / JsonDeserializer, які чудово працюють, але вам потрібно оновити їх для змін у своєму класі (наприклад, коли ви додасте поле). Ви втрачаєте автомагію.

Найпростіше зробити це (що було б некрасиво, але дуже чисто і просто, якщо перша пропозиція не працює) - просто назвати поле таким чином, щоб зробити щасливим GSON, і додати додаткові методи доступу з іменами, які вам подобаються , напр

public boolean isXXX() {return this.is_XXX;}

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