Отображение полей 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());
Что-то может быть неправильно с стратегией именования свойств - если вы используете пользовательский.