2010-03-03 39 views
72

Estoy usando GSON para convertir datos JSON que obtengo en 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.Convertir nombres de propiedades de estilo JSON en nombres de CamelCase de Java con GSON

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

+3

Propongo aceptar una respuesta – JeanValjean

Respuesta

2

Tenga en cuenta que su ejemplo es una carcasa de borde. 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 'is' 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'.

2

Creo que lo que quiere es 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 de acceso adicionales con los nombres que te gustan, por ejemplo

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

lo fácil es lo que estoy haciendo en este momento y funciona muy bien. Todo el código estilo java no típico y feo está oculto en las clases de datos y nadie desde el exterior lo verá. Pero todavía me molesta un poco :) – Janusz

206

he encontrado la siguiente configuración funciona perfecto al leer JSON con atributos subrayados y el uso de camelCasing en mis modelos.

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

Esto debería ser una respuesta aceptada. –

+2

¡Gran respuesta, gracias! @janusz, si alguna de estas respuestas te ayudó, márcalas como Respuesta Aceptada. – sufinawaz

+1

Si tiene un caso en el que el nombre contiene dos guiones bajos, ignora el primer guión bajo. Ex. this_key_has__two_underscores se convertirá en thisKeyHas_TwoUnderscores y lo mismo viceversa. El punto clave es FieldNamingPolicy, donde la enumeración dice "minúsculas" con guiones bajos, mientras que aquí el nombre convertido tiene una mayúscula con guión bajo (_T). –

62

Puede utilizar el SerializedName anotación:

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

Nota: Cuando haya establecido un FieldNamingPolicy ya, SerializedName se sobreponen a sus ajustes para ese campo específico (muy útil para casos especiales).

Cuestiones relacionadas