ChatGPT解决这个技术问题 Extra ChatGPT

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

我正在使用杰克逊将我的对象转换为 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 显示为 {4 } 在 json 中。

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

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

a
alizelzele

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

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


还有一个 org.json4s.jackson 命名空间。 :) 以及可能的 jackson YMMV 的其他实现。
D
Dimitar II

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

Jackson MixIns

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

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

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

我很好奇这会影响序列化/反序列化字段时的性能吗?
V
Vlad Mihalcea

杰克逊

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