Java模型的JSON字段映射

发送的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 enrollCustomer(@RequestBody BannerData body, HttpServletRequest request) throws Exception { ... } 

请求/GetBanner返回:
客户端发送的请求在语法上是不正确的。

当json更改为时, 工作正常 (小写命名为Java字段名称):

 { "banner": "ABC" } 

但是我需要在JSON中使用 大写字段命名。
看起来像@JsonProperty(value = "Banner")不起作用。

这是正确的映射吗?

也许你只是尝试:

 @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 

使用依赖:

  org.codehaus.jackson jackson-mapper-asl 1.9.13  

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

我建议下面; (如果您使用的是ObjectMapper)

一旦获得了ObjectMapper,就可以使用PascalCase设置PropertyNamingStrategy。 这是文档的链接

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

如果你没有使用ObjectMapper-然后用@JsonNaming注释你的BannerData类,如下所示 –

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

我在github找到了@JsonNaming

您是否尝试将jackson从1.9.13更新为2.5.4(它有另一个工件组ID – com.fasterxml.jackson)

这段代码适合你吗?

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

和我一起工作(如果我用“banner”替换“Banner” – 用null“banner”字段得到错误的对象。)

此代码也很有用:

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

属性命名策略可能有问题 – 如果您使用自定义策略。

在吸气剂上尝试一下

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

编辑:

向我们展示您的Spring配置文件。 你真的在使用jackson吗? 见http://www.journaldev.com/2552/spring-restful-web-service-example-with-json-jackson-and-client-program

             

编辑2

既然你可能会或可能不会使用jackson…尝试一些其他注释@XmlElement(name="Banner")

从GSON或许@SerializedName("Banner")