Преобразование имен свойств стиля JSON в имена Java CamelCase с помощью GSON - PullRequest
88 голосов
/ 03 марта 2010

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

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

Ответы [ 4 ]

274 голосов
/ 04 августа 2012

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

Gson gson = new GsonBuilder()
    .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
    .create()
83 голосов
/ 21 октября 2013

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

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

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

2 голосов
/ 09 сентября 2010

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

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

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

public boolean isXXX() {return this.is_XXX;}
2 голосов
/ 09 сентября 2010

Имейте в виду, ваш пример - крайний случай. Если у вас есть свойство 'foo', его метод получения должен называться 'getFoo', а если у вас есть свойство с именем 'foo_bar', его метод получения должен называться 'getFooBar', однако в вашем примере вы отображаете логическое значение, а логическое значение имеет особые соглашения об именах в Java. Примитивное логическое свойство с именем online должно иметь метод получения с именем isOnline, а не getOnline или, что еще хуже, getIsOnline. Логический объект-обертка (то есть Boolean) не должен следовать этому особому случаю, а свойство с именем online должно иметь метод получения с именем getOnline.

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

...