如何使用 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
显示为 label
和 id
显示为 @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 注释枚举字段以进行反序列化