【问题标题】:How to change a field name in JSON using Jackson如何使用 Jackson 更改 JSON 中的字段名称
【发布时间】: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,如果这纯粹是用于组合的参考数据,您可能会拥有更多——创建一个通用实体(对或选项)来涵盖所有这些是一种可能的考虑方法。

标签: java jquery hibernate jquery-ui jackson


【解决方案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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 2018-01-12
    • 2010-11-09
    • 2020-01-25
    • 1970-01-01
    相关资源
    最近更新 更多