使用Jackson在JSON中更改字段名称

Ali*_*Ali 160 java jquery hibernate jquery-ui jackson

我正在使用杰克逊将我的一个物体转换为json.该对象有2个字段:

@Entity
public class City {
   @id
   Long id;
   String name;
   public String getName() { return name; }
   public void setName(String name){ this.name = name; }
   public Long getId() { return id; }
   public void setName(Long id){ this.id = id; }
}
Run Code Online (Sandbox Code Playgroud)

由于我想在jQuery自动完成功能中使用它,我希望'id'在json中显示为'value','name'显示为'label'.杰克逊的文档不明确这一点,我已经想尽注释,甚至远程好像它做什么,我需要,但我不能让name显示为label,并id显示为value在JSON.

有谁知道如何做到这一点,或者这是否可能?

hen*_*ren 309

你尝试过使用@JsonProperty吗?

@Entity
public class City {
   @id
   Long id;
   String name;

   @JsonProperty("label")
   public String getName() { return name; }

   public void setName(String name){ this.name = name; }

   @JsonProperty("value")
   public Long getId() { return id; }

   public void setId(Long id){ this.id = id; }
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,我曾尝试过,但是我正在做`@JsonProperty(value ="label")`并且它无法正常工作,我已经按照你的建议尝试了它并且它有效!谢谢man,这真的有助于简化代码. (5认同)
  • 有没有办法利用Jackson(或GSON)更改已存在的JSON字符串中的属性名称(而不是在序列化期间)? (2认同)

m3t*_*man 44

请注意org.codehaus.jackson.annotate.JsonPropertyJackson 1.x和com.fasterxml.jackson.annotation.JsonPropertyJackson 2.x中有.检查您正在使用的ObjectMapper(从哪个版本),并确保使用正确的注释.


Vla*_*cea 11

杰克逊

如果您使用的是 Jackson,那么您可以使用@JsonProperty注释来自定义给定 JSON 属性的名称。

因此,您只需使用注释对实体字段进行@JsonProperty注释并提供自定义 JSON 属性名称,如下所示:

@Entity
public class City {

   @Id
   @JsonProperty("value")
   private Long id;

   @JsonProperty("label")
   private String name;

   //Getters and setters omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)

JavaEE 或 JakartaEE JSON-B

JSON-B 是用于在 Java 对象与 JSON 之间相互转换的标准绑定层。如果您使用的是 JSON-B,那么您可以通过@JsonbProperty注释覆盖 JSON 属性名称:

@Entity
public class City {

   @Id
   @JsonbProperty("value")
   private Long id;

   @JsonbProperty("label")
   private String name;

   //Getters and setters omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)


Dim*_* II 10

还有一个选项可以重命名字段:

Jackson MixIns.

如果你处理你无法注释的第三方课程,或者你只是不想用杰克逊特定的注释污染课程,这很有用.

Mixins的Jackson文档已经过时,因此这个例子可以提供更清晰的信息.本质上:您创建mixin类,以您想要的方式进行序列化.然后将其注册到ObjectMapper:

objectMapper.addMixIn(ThirdParty.class, MyMixIn.class);
Run Code Online (Sandbox Code Playgroud)