2012-09-14 12 views
20

Creo que necesito crear un especialista ObjectMapper y no puedo encontrar ningún código de muestra para iniciar el proceso.Cambiar caso de campo con un ObjectMapper

El creador de JSON utiliza las propiedades .Net y public y, por lo tanto, usa nombres de campo con una inicial en mayúscula. Estoy analizando el JSON en POJO, así que me gustaría usar una inicial en minúscula.

En su extremo:

public class Facet 
    { 
     public string Name { get; set; } 
     public string Value { get; set; } 
    } 

En mi final por lo tanto, deben tener:

public class Facet { 
     public String Name; 
     public String Value; 
    } 

me gusta mucho más:

public class Facet { 
     public String name; 
     public String value; 
    } 

Estoy en lo cierto que esto podría hacerse con un ObjectMapper?

+1

He titulado de nuevo y se retira la segunda parte de la pregunta. La otra mitad está publicada [aquí] (http://stackoverflow.com/q/12450404/823393) – OldCurmudgeon

Respuesta

23

Su primer número se pueden abordar de manera muy sencilla con la @JsonProperty anotación:

// java-side class 
public class Facet 
{ 
    @JsonProperty("Name") 
    public String name; 

    @JsonProperty("Value") 
    public String value; 
} 

Ahora el ObjectMapper coincidirá con los nombres de los campos entubados diferente. Si no desea agregar anotaciones en sus clases, puede crear una clase Mix-a stand en para su Facet:

public class FacetMixIn 
{ 
    @JsonProperty("Name") 
    public String name; 

    @JsonProperty("Value") 
    public String value; 
} 

objectMapper.getDeserializationConfig().addMixInAnnotations(Facet.class, FacetMixIn.class); 

con ello se consigue lo mismo, sin que se requiera anotaciones adicionales en su Facet clase.

+0

Eso es exactamente lo que estaba buscando en la parte 1 :) Gracias. He agregado a la parte 2. ¿Eso lo hace más fácil? – OldCurmudgeon

+0

He dividido la pregunta original en dos ahora, así que ahora esta es una respuesta completa. Por supuesto, modificar para reflejar el cambio en la pregunta. – OldCurmudgeon

14

En lugar de anotar cada campo, Jackson ObjectMapper se puede configurar para usar un PropertyNamingStrategy integrado o personalizado, para aplicar una traducción coherente entre los nombres de propiedad/campo de Java y los nombres de elementos JSON.

Por ejemplo:

myObjectMapper.setPropertyNamingStrategy(PascalCaseStrategy); 
+0

Gracias @ProgrammerBruce por su ayuda adicional. Comprobaré que esto funciona cuando regrese al trabajo más adelante en el nuevo año. Por cierto, ¿hay una estrategia que coincida con CUALQUIER caso? Si no, quizás podrías publicar uno. Estoy intentando tratar con un cliente que podría cambiar sus convenciones en cualquier momento. – OldCurmudgeon

+0

Últimamente busqué (hace un año aproximadamente), las traducciones de nombres solo van en una dirección (desde nombres de propiedades/campos de Java a nombres de elementos JSON, o viceversa), y la implementación de coincidencias insensibles a las mayúsculas y minúsculas no fue tan trivial como de lo contrario podría ser. –

+0

@Jose: Son cosas diferentes. SnakeCaseStrategy es para "snake_case_variables" – dagnelies

5

Este problema podría ser resuelto desde Jackson 2.5.0 así:

ObjectMapper mapper = new ObjectMapper(); 
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true); 

Desde el javadoc:

com.fasterxml.jackson.databind.MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES

Característica que permitirá una deserialización más tolerante del JSON entrante. Si está habilitado, las propiedades del bean se emparejarán utilizando sus equivalentes de minúsculas , lo que significa que cualquier combinación de casos ( entrante y nombres coincidentes canonicalizados por la carcasa inferior) debería funcionar.

Tenga en cuenta que hay una sobrecarga de rendimiento adicional ya que los nombres de propiedades entrantes deben estar en minúscula antes de la comparación, para los casos donde hay letras mayúsculas. Sin embargo, los gastos generales para los nombres que son ya en minúscula deben ser insignificantes.

La característica está deshabilitada de forma predeterminada.

desde: 2,5

Cuestiones relacionadas