如何使用Jackson更改JSON中的字段名称


169

我正在使用杰克逊将我的对象转换为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; }
}

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

有谁知道该怎么做?


如果您打算将实体(“城市”)用于任何其他目的或业务逻辑,那么我将避免将其JSON表示形式定义为Label&Value。OTOH如果这纯粹是用于组合的参考数据,则您可能会拥有更多的内容-可以考虑使用使通用实体(对或对)覆盖所有这些内容。
Thomas W

Answers:


323

您是否尝试过使用@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; }
}

5
是的,我已经尝试过了,但是我正在这样做,但是@JsonProperty(value="label")它没有用,我已经按照您的建议进行了尝试,并且可以使用!谢谢,这将确实有助于简化代码。
阿里

我有类似的要求。只是我在RESTEasy上使用Jackson,但这不起作用:-/奇怪!
Niks 2014年

验证杰克逊确实是配置的提供者,而不是其他任何人
henrik_lundgren 2014年

2
有没有办法利用Jackson(或GSON)来更改现有JSON字符串中的属性名称(而不是在序列化期间)?
唐·奇德尔

我已经使用对象@JsonProperty(“ object”)val jsonObject:字符串,...但是失败
Raju yourPepe '18

45

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


还有一个org.json4s.jackson名称空间。:)以及jacksonYMMV的其他实现。
杰西·奇斯霍尔姆

14

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

杰克逊MixIns

如果您处理的是第三方课程,则很有用 无法注释的或者只是不想用Jackson特定的注释污染用。

Mixins的Jackson文档已过时,因此此示例可以提供更多的清晰度。本质上:您可以创建mixin类,以所需的方式进行序列化。然后将其注册到ObjectMapper:

objectMapper.addMixIn(ThirdParty.class, MyMixIn.class);

我很好奇,这会在序列化/反序列化字段时影响性能吗?
chanllen

2

杰克逊

如果使用的是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
}

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
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.