example deserialize java json jackson deserialization

deserialize - Mapeo de campos JSON para el modelo Java



objectmapper java (4)

JSON que se envía:

{ "Banner": "ABC" }

Modelo de Java:

... @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class BannerData implements java.io.Serializable { private static final long serialVersionUID = 5664846645733319592L; @JsonProperty(value = "Banner") private String banner; public String getBanner() { return banner; } public void setBanner(String banner) { this.banner = banner; } }

Controlador:

@RequestMapping(value = {"/GetBanner"}, method = RequestMethod.POST) @ResponseBody public ResponseEntity<String> enrollCustomer(@RequestBody BannerData body, HttpServletRequest request) throws Exception { ... }

solicitud a /GetBanner devuelve:
La solicitud enviada por el cliente fue sintácticamente incorrecta.

Funciona bien cuando json cambió a (nombre en minúscula como es el nombre de campo de Java):

{ "banner": "ABC" }

Sin embargo, necesito nombres de mayúsculas en JSON .
Parece que @JsonProperty(value = "Banner") no funciona.

¿Es correcto el mapeo?


¿Ha intentado actualizar su jackson de 1.9.13 a 2.5.4 (tiene otra identificación de grupo de artefactos - com.fasterxml.jackson)

¿Este código funciona correctamente para usted?

ObjectMapper mapper = new ObjectMapper(); BannerData bannerData = mapper.readValue("{ /"Banner/": /"ABC/"}", BannerData.class);

Funciona bien conmigo (si sustituyo "Banner" por "banner" - el objeto equivocado tiene un campo "banner" nulo).

También este código puede ser útil:

System.out.println(mapper.getDeserializationConfig().getPropertyNamingStrategy());

Algo puede estar mal con la estrategia de denominación de propiedades, si usa una personalizada.


Pruébalo en el getter.

@JsonProperty(value = "Banner") public String getBanner() {

EDITAR:

Muéstrenos su archivo de configuración de primavera. ¿Realmente estás usando Jackson? Consulte http://www.journaldev.com/2552/spring-restful-web-service-example-with-json-jackson-and-client-program

<!-- Configure to plugin JSON as request and response in method handler --> <beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <beans:property name="messageConverters"> <beans:list> <beans:ref bean="jsonMessageConverter"/> </beans:list> </beans:property> </beans:bean> <!-- Configure bean to convert JSON to POJO and vice versa --> <beans:bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> </beans:bean>

Editar 2

Ya que puedes o no estar usando Jackson ... prueba otras anotaciones @XmlElement(name="Banner")

De GSON quizás @SerializedName("Banner")


Tal vez solo intentas:

@JsonProperty("Banner")

sin ''valor =''. Lo usé en mi proyecto y en realidad funcionó como se esperaba.

ACTUALIZAR

Acabo de crear algunas clases de prueba para probar el comportamiento de tu problema. Que he hecho:

import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.map.annotate.JsonSerialize; @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class BannerData implements java.io.Serializable { private static final long serialVersionUID = 5664846645733319592L; @JsonProperty("Banner") private String banner; public String getBanner() { return banner; } public void setBanner(String banner) { this.banner = banner; } }

Otra clase para leer el json:

import org.codehaus.jackson.map.ObjectMapper; import java.io.File; import java.io.IOException; public class BannerReader { private static final String JSON_PATH = "pathToYourJson"; public BannerData readBanner() throws IOException { ObjectMapper mapper = new ObjectMapper(); return mapper.readValue(new File(JSON_PATH), BannerData.class); } }

Y finalmente la clase de punto de entrada:

import java.io.IOException; public class BannerTest { public static void main(String[] args) throws IOException { BannerReader reader = new BannerReader(); BannerData bannerData = reader.readBanner(); System.out.println(bannerData.getBanner()); } }

huellas dactilares:

ABC

Dependencia utilizada:

<dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.13</version> </dependency>

archivo json:

{ "Banner": "ABC" }

ACTUALIZACIÓN 2

Si bien el código anterior no funciona para usted, intente agregar

@JsonProperty("Banner")

no solo a la variable privada, sino también al par getter / setter, como:

@JsonProperty("Banner") private String banner; @JsonProperty("Banner") public String getBanner() { return banner; } @JsonProperty("Banner") public void setBanner(String banner) { this.banner = banner; }


Yo sugeriría a continuación; (Si está utilizando ObjectMapper)

Una vez que obtenga su ObjectMapper, puede establecer PropertyNamingStrategy con PascalCase. Este es un enlace para la documentación.

ObjectMapper mapper = new ObjectMapper(); mapper.setPropertyNamingStrategy( PropertyNamingStrategy.PascalCaseStrategy);

Si no está utilizando ObjectMapper, BannerData su clase @JsonNaming con @JsonNaming como a continuación:

@JsonNaming(PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy.class) public class BannerData implements java.io.Serializable {

Me enteré de @JsonNaming aquí en github