Java模型的JSON字段映射

时间:2015-06-19 17:11:34

标签: java json jackson deserialization

发送的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")不起作用。

映射是否正确?

4 个答案:

答案 0 :(得分:13)

也许你只是尝试:

@JsonProperty("Banner")

没有'value ='。我在我的项目中使用它,它实际上按预期工作。

<强>更新

我刚刚创建了一些测试类来测试问题的行为。我做了什么:

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

答案 1 :(得分:6)

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

获得ObjectMapper后,可以使用PascalCase设置PropertyNamingStrategy。 this is link for documentation

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

如果您没有使用ObjectMapper-然后使用BannerData注释您的@JsonNaming课程,如下所示 -

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

我发现了@JsonNaming here in github

答案 2 :(得分:3)

在getter上试试

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

编辑:

向我们展示您的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")

答案 3 :(得分:3)

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

此代码是否适合您?

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

与我合作(如果我更换&#34; Banner&#34;使用&#34; banner&#34; - 使用null&#34; banner&#34; field得到错误的对象。)

此代码也很有用:

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

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