Java 模型的 JSON 字段映射

2022-09-02 09:57:47

发送的 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")

不带“值 =”。我在我的项目中使用它,它实际上按预期工作。

更新

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

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后,您可以使用PascalCase设置PropertyNamingStrategy。这是文档链接

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

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

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

我在github中发现了@JsonNaming