Преобразование имен свойств стиля JSON в имена Java CamelCase с помощью GSON

Я использую GSON для преобразования данных JSON, которые я получаю к объекту Java. Он работает очень хорошо во всех моих тестах. Проблема в том, что наши реальные объекты имеют некоторые свойства, называемые is_online. GSON только отображает их, если они названы полностью равными, было бы неплохо, чтобы GSON конвертировал имена в Java camel case isOnline.

Кажется, это возможно при создании данных JSON, случай верблюда преобразуется в подчеркивание разделенных слов в JSON. Но я не могу найти способ указать это в обратном направлении.

Ответ 1

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

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

Ответ 2

Вы можете использовать аннотацию SerializedName :

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

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

Ответ 3

Помните, что ваш пример - это край. Если у вас есть свойство "foo", его получатель должен иметь имя "getFoo", и если у вас есть свойство с именем "foo_bar", его получатель должен иметь имя "getFooBar", однако в вашем примере вы сопоставляете логические и логические специальные соглашения об именах в java. У примитивного логического свойства, называемого онлайн, должен быть геттер с именем isOnline, NOT 'getOnline' или еще хуже, 'getIsOnline'. Объект boolean wrapper (т.е. Boolean) не должен следовать этому специальному случаю, а свойство с именем "онлайн" должно иметь getter с именем "getOnline".

Следовательно, наличие логических свойств с именем "is" в названии - это крайний случай, когда вы захотите удалить этот префикс во время вашего преобразования. В обратном направлении ваш код может захотеть проверить объект json как для имени сырого свойства, так и для версии is_XXX.

Ответ 4

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

Если это не сработает, вы можете использовать пользовательские JsonSerializer/JsonDeserializers, которые отлично работают, но вы должны обновлять их для изменений в своем классе (например, при добавлении поля). Вы теряете автоматическую магию.

Проще всего сделать (что было бы уродливо, но очень просто и чисто, если первое предложение не работает) было бы просто назвать поле, чтобы сделать GSON счастливым, и добавить дополнительные методы доступа с помощью имена, которые вам нравятся, например

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