将 json 字段绑定到 POJO 中具有不同名称的字段的注解

Posted

技术标签:

【中文标题】将 json 字段绑定到 POJO 中具有不同名称的字段的注解【英文标题】:Annotation for binding a json field to a field in POJO with a different name 【发布时间】:2016-12-16 07:18:45 【问题描述】:

Java 类(用作数据传输对象):

类 Resource 还有一个名为 id 的字段,它的 getter 和 setter 类型不同,因此会出现语法错误。

class A extends Resource

   private int id;

   public int getId()  return id;    // syntax error as getId() function already exists in Resource
   public void setId(int id)  this.id = id; 

由于上面的类是DTO,所以会映射一个JSON响应(带字段id),不能使用getId(),我想把字段改成_id_,改getter和setter相应地,并用注释将其绑定到id 字段。

注意:我使用的是弹簧靴。我尝试使用 @JsonProperty 注释,但没有奏效。春天有没有注释可以做到这一点?

【问题讨论】:

@JsonProperty("id") 不起作用? 不,它不起作用。它仍然会寻找一个名为“id”的字段 当你说它不起作用时......是不是抛出了一些异常?你能提供一些关于它是如何不起作用的见解吗? 【参考方案1】:

谷歌搜索并找到了这个问题:Jackson serialization: how to ignore superclass properties。根据您的问题对其进行了调整。

public class A extends B 
    private int id;

    public A(int id) 
        super.setId("id" + id);
        this.id = id;
    

    @Override
    @JsonProperty("_id_")
    public String getId() 
        return super.getId();
    

    @Override
    @JsonProperty("_id_")
    public void setId(String id) 
        super.setId(id);
    

    @JsonProperty("id")
    public int getIntId() 
        return id;
    

    @JsonProperty("id")
    public void setIntId(int id) 
        this.id = id;
    


public class B 
    private String id;

    public String getId() 
        return id;
    

    public void setId(String id) 
        this.id = id;
    

用这个测试它:

@RestController
public class TestController 
    @GetMapping("/test")
    public A test() 
        return new A(1);
    

输出是:


  "_id_": "id1",
  "id": 1

【讨论】:

【参考方案2】:
public A extends Resource 
    private int id;

    @JsonProperty("_id")
    public int getId() 
      return id;
    

    @JsonProperty("id")
    public void setId(int id) 
      this.id = id;
    

方法名应该不同,所以jackson将其解析为不同的字段,而不是一个字段。

【讨论】:

@JsonProperty 没有像我提到的那样工作。它应该与 Spring MVC 或 Spring Boot 一起使用吗? 另外,我不能有一个 getId() 函数,因为在超类中有一个函数 getId() 具有不同的返回类型 或者只是将两个不同的 getter/setter 对绑定到一个变量,正如我在之前评论中给出的链接中所评论的那样 他们使用了同样的东西。 @JsonProperty。这对我不起作用 那么你需要找到它为什么不起作用的答案,而不是你可以用什么来解决这类问题。

以上是关于将 json 字段绑定到 POJO 中具有不同名称的字段的注解的主要内容,如果未能解决你的问题,请参考以下文章

使用GSON将更改字段名称映射到POJO

如何使用GSON配置哪些POJO字段序列化为JSON?

如何将 JSON 字段名称映射到不同的对象字段名称?

Retrofit2:如何在具有不同字段名称的对象中接收 JSON 响应?

具有公共字段的不同 api 的 POJO 声明

具有不同字段名称和 JavaScript 控件名称的 DevExpress 控件