Отображение полей JSON для модели Java

JSON, который отправляется:

{
  "Banner": "ABC"
}

Модель 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;
    }
}

Контроллер:

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

запрос /GetBanner возвращает:
Запрос, отправленный клиентом, был синтаксически неправильным.

Работает нормально, когда json изменился на (имя нижнего регистра как имя поля Java):

{
  "Banner": "ABC"
}

Однако мне нужно прописать имя верхнего регистра в JSON.
Похоже, @JsonProperty(value = "Banner") не работает.

Правильно ли это сопоставление?

Ответы

Ответ 1

Возможно, вы просто попытаетесь:

@JsonProperty("Banner")

без 'value ='. Я использовал его в своем проекте, и он действительно работал так, как ожидалось.

UPDATE

Я только что создал несколько тестовых классов, чтобы протестировать проблему вашей проблемы. Что я сделал:

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

Другой класс для чтения 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);
 }
}

И, наконец, класс точки входа:

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

печатает:

ABC

Используемая зависимость:

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

Файл json:

{
  "Banner": "ABC"
}

ОБНОВЛЕНИЕ 2

Пока приведенный выше код не работает для вас, попробуйте добавить

@JsonProperty("Banner")

не только к частной переменной, но также к паре getter/setter, например:

@JsonProperty("Banner")
private String banner;

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

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

Ответ 2

Я бы предложил ниже; (Если вы используете ObjectMapper)

после получения объекта ObjectMapper вы можете установить PropertyNamingStrategy с помощью PascalCase. это ссылка для документации

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

Если вы не используете ObjectMapper, тогда аннотируйте свой класс BannerData с помощью @JsonNaming, как показано ниже -

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

Я узнал @JsonNaming здесь, в github

Ответ 3

Попробуйте на getter

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

EDIT:

Покажите нам свой конфигурационный файл Spring. Вы действительно используете Джексона? См. 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> 

ИЗМЕНИТЬ 2

Так как вы можете или не можете использовать Джексона... попробуйте другие аннотации @XmlElement(name="Banner")

Из GSON возможно @SerializedName("Banner")

Ответ 4

Вы пытались обновить свой Джексон с 1.9.13 до 2.5.4 (у него есть еще один идентификатор группы артефактов - com.fasterxml.jackson)

Этот код работает правильно для вас?

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

Хорошо работает со мной (если я заменил "Баннер" на "баннер" - получил неправильный объект с нулевым полем "баннер".)

Также этот код может быть полезен:

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

Что-то может быть неправильно с стратегией именования свойств - если вы используете пользовательский.