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

Posted

技术标签:

【中文标题】如何使用 Jackson 更改 JSON 中的字段名称【英文标题】:How to change a field name in JSON using Jackson 【发布时间】:2011-11-07 23:05:46 【问题描述】:

我正在使用 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; 

由于我想将它与 jQuery 自动完成功能一起使用,我希望“id”在 json 中显示为“值”,而“名称”则显示为“标签”。杰克逊的文档对此并不清楚,我已经尝试了每一个注释,即使是远程似乎也能满足我的需要,但我无法让 name 显示为 labelid 显示为 @987654325 @在json中。

有谁知道怎么做或者这是否可行?

【问题讨论】:

如果您可能将实体(“城市”)用于任何其他目的或业务逻辑,我会避免将其 JSON 表示定义为标签和值。 OTOH,如果这纯粹是用于组合的参考数据,您可能会拥有更多——创建一个通用实体(对或选项)来涵盖所有这些是一种可能的考虑方法。 【参考方案1】:

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

【讨论】:

是的,我已经尝试过了,但是我在做@JsonProperty(value="label") 并且它不起作用,我已经按照您的建议尝试了它并且它有效!谢谢伙计,这真的有助于简化代码。 我也有类似的要求。只是我将 Jackson 与 RESTEasy 一起使用,但这不起作用:-/ 奇怪! 验证 Jackson 确实是配置的提供者,而不是其他东西 有没有办法利用 Jackson(或 GSON)来更改已经存在的 JSON 字符串中的属性名称(不是在序列化期间)? 我用过对象@JsonProperty("object") val jsonObject: String, ...但是失败了【参考方案2】:

请注意,Jackson 1.x 中有 org.codehaus.jackson.annotate.JsonProperty,Jackson 2.x 中有 com.fasterxml.jackson.annotation.JsonProperty。检查您使用的是哪个 ObjectMapper(来自哪个版本),并确保您使用了正确的注解。

【讨论】:

还有一个org.json4s.jackson命名空间。 :) 以及jackson YMMV 的其他可能实现。【参考方案3】:

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

Jackson MixIns.

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

关于 Mixins 的 Jackson 文档已经过时,所以 example 可以提供更清晰的说明。本质上:您创建了 mixin 类,它以您想要的方式进行序列化。然后注册到ObjectMapper:

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

【讨论】:

我很好奇这会影响序列化/反序列化字段时的性能吗?【参考方案4】:

杰克逊

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

【讨论】:

以上是关于如何使用 Jackson 更改 JSON 中的字段名称的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Jackson 解析 JSON 数组项中的原始值?

如何使用jackson(Java)反序列化对象中的json对象?

使用 Jackson 和 Json-View 排除 json 中的字段

如何使用 Jackson json 注释枚举字段以进行反序列化

如何更改杰克逊以检测 POJO 中的所有字段,而不仅仅是公共字段?

Jackson - 自定义反序列化器不会读取 JSON 中的所有字段