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