java json gson camelcasing

Convierta nombres de propiedades de estilo JSON en nombres de CamelCase de Java con GSON



camelcasing (4)

Estoy usando GSON para convertir los datos JSON que obtengo a un objeto Java. Funciona bastante bien en todas mis pruebas. El problema es que nuestros objetos reales tienen algunas propiedades nombradas como is_online. GSON solo los mapea si se nombran totalmente iguales, sería bueno tener a GSON convirtiendo los nombres a Java camel case isOnline.

Parece que esto es posible mientras se crean los datos JSON, camel case se convierte en subrayar palabras separadas en JSON. Pero no puedo encontrar una forma de especificar esto al revés.


Creo que lo que quieres está here . Usando anotaciones puedes decirle a GSON que mySuperCoolField en realidad se llama this_field_is_fun en el JSON y lo descomprimirá correctamente. Al menos creo que también funciona para la deserialización.

Si eso no funciona, puede utilizar JsonSerializer / JsonDeserializers personalizados, que funcionan muy bien, pero debe actualizarlos para conocer los cambios en su clase (como cuando agrega un campo). Pierdes la auto-magia.

Lo más fácil de hacer (que sería feo, pero muy limpio y simple si la primera sugerencia no funciona) sería simplemente nombrar el campo de una manera para hacer feliz a GSON, y agregar métodos adicionales de acceso con los nombres que te gusten. , p.ej

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


He encontrado que la siguiente configuración funciona perfectamente cuando leo json con atributos subrayados y uso de camelcasing en mis modelos.

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


Puede usar la anotación SerializedName :

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

Nota: Cuando haya configurado una FieldNamingPolicy ya, SerializedName sobrescribirá su configuración para ese campo específico (bastante útil para casos especiales).


Tenga en cuenta que su ejemplo es un caso marginal. Si tiene una propiedad ''foo'' su getter debe llamarse ''getFoo'', y si tiene una propiedad llamada ''foo_bar'', su getter debe llamarse ''getFooBar'', sin embargo, en su ejemplo está mapeando un booleano y los booleanos tienen convenios de nombres de casos especiales en java. Una propiedad booleana primitiva llamada en línea debería tener un getter llamado ''isOnline'', NO ''getOnline'' o incluso peor, ''getIsOnline''. Un objeto contenedor booleano (es decir, booleano) no debe seguir este caso especial y una propiedad llamada ''en línea'' debe tener un getter llamado ''getOnline''.

Por lo tanto, tener propiedades booleanas con ''es'' en el nombre es un caso marginal, donde querrá quitar este prefijo en particular durante su conversión. En la dirección inversa, es posible que su código desee inspeccionar el objeto json tanto para un nombre de propiedad sin formato como para una versión ''is_XXX''.