web-dev-qa-db-fra.com

Mappage de champs JSON pour Java

JSON qui est envoyé:

{
  "Banner": "ABC"
}

Modèle 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;
    }
}

Manette:

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

demande à /GetBanner renvoie:
La demande envoyée par le client était syntaxiquement incorrecte.

Works OK lorsque json est devenu (nom en minuscules tel quel Java nom du champ):

{
  "banner": "ABC"
}

Cependant, j'ai besoin d'un nom de champ en majuscule dans [~ # ~] json [~ # ~] .
On dirait que @JsonProperty(value = "Banner") ne fonctionne pas.

Est-ce une cartographie correcte?

19
sergionni

Peut-être que vous essayez simplement de:

@JsonProperty("Banner")

sans 'value ='. Je l'ai utilisé dans mon projet et cela a fonctionné comme prévu.

MISE À JOUR

Je viens de créer des classes de test pour tester le comportement de votre problème. Ce que j'ai fait:

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;
 }
}

Une autre classe pour lire le 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);
 }
}

Et enfin la classe de point d'entrée:

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());
 }
}

impressions:

ABC

Dépendance utilisée:

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

fichier json:

{
  "Banner": "ABC"
}

MISE À JOUR 2

Bien que le code ci-dessus ne fonctionne pas pour vous, essayez d'ajouter

@JsonProperty("Banner")

non seulement à la variable privée, mais aussi à la paire getter/setter, comme:

@JsonProperty("Banner")
private String banner;

@JsonProperty("Banner")
public String getBanner() {
  return banner;
}

@JsonProperty("Banner")
public void setBanner(String banner) {
  this.banner = banner;
}
13
Arthur Eirich

Je suggérerais ci-dessous; (Si vous utilisez ObjectMapper)

une fois que vous obtenez votre ObjectMapper, vous pouvez définir PropertyNamingStrategy avec PascalCase. c'est le lien pour la documentation

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

Si vous n'utilisez pas ObjectMapper, annotez votre classe BannerData avec @JsonNaming comme ci-dessous--

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

J'ai découvert @JsonNaming ici dans github

6
Ashish Patil

Essayez-le sur le getter

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

ÉDITER:

Montrez-nous votre fichier de configuration Spring. Utilisez-vous vraiment Jackson? Voir 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> 

EDIT 2

Puisque vous pouvez utiliser Jackson ou non ... essayez d'autres annotations @XmlElement(name="Banner")

De GSON peut-être @SerializedName("Banner")

3
Shaun

Avez-vous essayé de mettre à jour votre jackson de 1.9.13 à 2.5.4 (il a un autre identifiant de groupe d'artefact - com.fasterxml.jackson)

Ce code fonctionne-t-il correctement pour vous?

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

Fonctionne très bien avec moi (si je remplace "Bannière" par "bannière" - objet incorrect avec le champ "bannière" nul.)

Ce code peut également être utile:

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

Quelque chose ne va pas avec la stratégie de dénomination des propriétés - si vous en utilisez une personnalisée.

3
pkozlov