JsonProperty
不会覆盖 jackson 从 getter 获取的默认名称。如果我用 ObjectMapper
和 Jackson 序列化下面的类,我会得到
{"hi":"hello"}
可以看到 JsonProperty 注解没有效果
class JacksonTester {
String hi;
@JsonProperty("hello")
public String getHi() {
return hi;
}
}
将
@JsonProperty
放在字符串本身上也不起作用。似乎我可以更改名称的唯一方法是重命名 getter,唯一的问题是第一个字母将始终为小写
问题是我同时使用了新旧杰克逊库
即在我之前
import org.codehaus.jackson.annotate.JsonProperty;
我必须将其更改为下面的内容,以与我正在使用的库保持一致。
由于我使用了 Maven,这也意味着更新我的 Maven 依赖项。
import com.fasterxml.jackson.annotation.JsonProperty;
为了让它工作,我需要在 getter 上添加
@JsonProperty
注释(将它放在对象上不起作用)
我在这里找到了答案(感谢francescoforesti) @JsonProperty 未按预期工作
如果使用 Kotlin
我知道最初的问题是在 Java 中,但由于 Kotlin 变得非常流行,并且许多人可能正在使用它,我想将其发布在这里以帮助其他人。
无论如何,对于 Kotlin 来说,因为 getter/setter 的工作方式,如果您使用
val
,意味着您只公开 getter,您可能需要将注释应用到 getter,如下所示:
class JacksonTester(@get:JsonProperty("hello") val hi: String)
我知道这是一个老问题,但对我来说,当我发现它与 Gson 库冲突时,我就开始工作了,所以我不得不使用
@SerializedName("name")
而不是 @JsonProperty("name")
希望这会有所帮助
我也有同样的问题
您只需替换导入 com.fasterxml.jackson.annotation.JsonProperty; 在 导入 org.codehaus.jackson.annotate.JsonProperty; 它的工作。
我在从旧版本更新到 FasterXML Jackson 2.8.3 时遇到了这个问题。
问题是当将来自数据库的 JSON 响应反序列化为 Java 类对象时,我们的代码在类的 setter 上没有
@JsonSetter
。因此,在序列化时,输出没有利用类的 getter 将 Java 类对象序列化为 JSON(因此 @JsonProperty()
装饰器没有生效)。
我通过将
@JsonSetter("name-from-db")
添加到该属性的 setter 方法中解决了该问题。
此外,要使用 getter 方法重命名属性,您可以而且应该使用
@JsonProperty()
,而不是 @JsonGetter()
,它更具体地用于重命名属性。
这是我们的代码:
public class KwdGroup {
private String kwdGroupType;
// Return "type" instead of "kwd-group-type" in REST API response
@JsonGetter("type") // Can use @JsonProperty("type") as well
public String getKwdGroupType() {
return kwdTypeMap.get(kwdGroupType);
}
@JsonSetter("kwd-group-type") // "kwd-group-type" is what JSON from the DB API outputs for code to consume
public void setKwdGroupType(String kwdGroupType) {
this.kwdGroupType = kwdGroupType;
}
}
我最近在这个问题上遇到了另一个有趣的转折。我们开始使用 Hibernate5Module 来帮助解决一些延迟加载问题。此外,我们使用 Groovy,因此我们没有定义 getter 和 setter。
事实证明,Hibernate 模块似乎干扰了
@JsonProperty
注释。具体来说,如果您有一些带有 @Transient
注释的内容,那么,如果您有类似的内容:
@Transient
@ApiModelProperty(required = true)
@JsonProperty("alternateName")
String property
您不会在 JSON 中看到
alternateName
。此外,您的客户可能会在 POST 和 PUT 方面遇到问题!要解决此问题,您可以使用一个简单的解决方法。为您需要使用的内部名称定义 getter 和 setter(*),并且不要在 value
上使用 @JsonProperty
属性,所以这有效:
@Transient
@ApiModelProperty(required = true)
@JsonProperty
String alternateName
void setProperty(String property) {
this.alternateName = property
}
@JsonIgnore
String getProperty() {
this.alternateName
}
注意吸气剂上
@JsonIgnore
的使用。如果不这样做,您的框架可能会选择它,并且您的 JSON 中会出现相同内容的重复条目。
无论如何 - 我希望这对某人有帮助!
(*)我们试图遵守特定的接口,从而在内部强制执行该名称。然而,公开的 API 需要一个不同的、用户友好的名称。
即使定义了正确的注释,Camel 案例似乎仍然存在问题。 示例:
@JsonProperty(“镜像端口”) 私有字符串镜像端口;
当 xml 有
<mirrorport>YES</mirrorport>
时反序列化仍然失败
我缺少数据绑定依赖项
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${fasterxml.version}</version>
</dependency>
将其放在变量上,而不是 getter 上
class JacksonTester {
@JsonProperty("hello")
private String hi;
public String getHi() {
return hi;
}
}
您尝试过以下吗
class JacksonTester {
private String hi;
@JsonProperty("hello")
public String getHi() {
return hi;
}
}
我的意思是将“hi”变量声明设为私有。 或者尝试在变量声明上添加@JsonIgnore,以防万一您宁愿将其保留在默认范围内。
我也有同样的问题, 当我同时使用 com.fasterxml.jackson.core 和 com.google.code.gson:gson 时,就会发生这种情况
我解决了使用 gson.annotations
@SerializedName("enum")
而不是 fastxml 附带的 @JsonProperty("enum")
谢谢
我遇到了同样的问题,@JsonProperty 不起作用。我没有任何旧版本的 jackson 库,也没有任何 gson 库,因为这似乎是其他答案中提到的问题。
这是因为我的代码使用了错误的 JSON 序列化器,该序列化器不关心 JsonProperty 注释。它使用的是雅加达。为了强制它使用jackson进行反序列化,我添加了以下代码-
ObjectMapper objectMapper = new ObjectMapper();
MyObject myObject = objectMapper.convertValue(value, MyObject.class);
// value can be your json string or Object
我在评论中找到了我的具体问题的答案 - @JsonProperty 不起作用(Weblogic 12.2.1 和 Java 8)
试试这个
class JacksonTester {
private String hi;
@JsonProperty("hi")
public String getHi() {
return hi;
}
}