Jackson 未使用 @JsonProperty 覆盖 Getter
Jackson Not Overriding Getter with @JsonProperty
JsonProperty
并未覆盖 jackson 从 getter 获得的默认名称。如果我用 ObjectMapper
和 jackson 序列化下面的 class 我得到
{"hi":"hello"}
如您所见,JsonProperty 注释无效
class JacksonTester {
String hi;
@JsonProperty("hello")
public String getHi() {
return hi;
}
}
将 @JsonProperty
放在字符串本身上也不起作用。似乎我可以更改名称的唯一方法是重命名 getter,唯一的问题是第一个字母
将始终为小写
放在变量上,而不是 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 放在变量声明上,以防您希望将其保留在默认范围内。
问题是我同时使用了旧的和新的 jackson 库
即在我有之前
import org.codehaus.jackson.annotate.JsonProperty;
为了与我使用的库保持一致,我不得不将其更改为以下内容。
由于我使用的是 Maven,这也意味着更新我的 Maven 依赖项。
import com.fasterxml.jackson.annotation.JsonProperty;
为了让它起作用,我需要 getter 上的 @JsonProperty
注释(将它放在对象上不起作用)
我在这里找到了答案(感谢 francescoforesti)
@JsonProperty not working as expected
即使在定义了正确的注释之后,骆驼案例似乎仍然存在问题。
示例:
@JsonProperty("mirrorport")
私有字符串镜像端口;
当xml有<mirrorport>YES</mirrorport>
时反序列化仍然失败
我有同样的问题
你只需要替换import
导入 com.fasterxml.jackson.annotation.JsonProperty;
在
导入 org.codehaus.jackson.annotate.JsonProperty;
它的工作。
我最近在这个问题上遇到了另一个有趣的转折。我们开始使用 Hibernate5Module 来帮助解决一些延迟加载问题。此外,我们使用 Groovy,所以我们没有定义 getters 和 setter。
事实证明,Hibernate 模块似乎干扰了 @JsonProperty
注释。特别是如果你有一些用 @Transient
注释的东西 那么,如果你有这样的东西:
@Transient
@ApiModelProperty(required = true)
@JsonProperty("alternateName")
String property
您不会在 JSON 中看到 alternateName
。此外,您的客户可能会遇到他们的 POST 和 PUT 问题!要解决此问题,您可以使用一个简单的解决方法。为您需要使用的内部名称定义 getters 和 setter(*),并且不要在 @JsonProperty
上使用 value
属性所以这有效:
@Transient
@ApiModelProperty(required = true)
@JsonProperty
String alternateName
void setProperty(String property) {
this.alternateName = property
}
@JsonIgnore
String getProperty() {
this.alternateName
}
注意 getter 上 @JsonIgnore
的使用。如果不这样做,您的框架可能会选择它,并且您的 JSON.
中将有相同内容的重复条目
无论如何 - 我希望这对某人有所帮助!
(*)我们试图遵守一个特定的界面,从而在内部强制使用该名称。但是,公开的 API 需要一个不同的、用户友好的名称。
我在从旧版本更新到 FasterXML Jackson 2.8.3 时遇到了这个问题。
问题是在将来自我们数据库的 JSON 响应反序列化为 Java class 对象时,我们的代码在 [=28= 上没有 @JsonSetter
]' setters。因此,在序列化时,输出没有利用 class' getters 将 Java class 对象序列化为 JSON(因此 @JsonProperty()
装饰器没有生效)。
我通过将 @JsonSetter("name-from-db")
添加到 属性 的 setter 方法来解决这个问题。
此外,要使用 getter 方法重命名属性,您可以而且应该使用 @JsonGetter()
,而不是 @JsonProperty()
,它更适合重命名属性。
这是我们的代码:
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;
}
}
我缺少数据绑定依赖项
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${fasterxml.version}</version>
</dependency>
我知道这是一个老问题,但对我来说,当我发现它与 Gson 库冲突时,我就开始工作了,所以我不得不使用 @SerializedName("name")
而不是 @JsonProperty("name")
希望这有帮助
如果使用 Kotlin
我知道原来的问题在 Java 中,但是由于 Kotlin 变得非常流行并且许多人可能正在使用它,所以我想 post 在这里帮助其他人。
无论如何,对于 Kotlin,因为 getters/setters 的工作方式,如果您使用 val
,意味着您只公开 getter,您可能需要将注释应用于 getter 如下所示:
class JacksonTester(@get:JsonProperty("hello") val hi: String)
试试这个
class JacksonTester {
private String hi;
@JsonProperty("hi")
public String getHi() {
return hi;
}
}
JsonProperty
并未覆盖 jackson 从 getter 获得的默认名称。如果我用 ObjectMapper
和 jackson 序列化下面的 class 我得到
{"hi":"hello"}
如您所见,JsonProperty 注释无效
class JacksonTester {
String hi;
@JsonProperty("hello")
public String getHi() {
return hi;
}
}
将 @JsonProperty
放在字符串本身上也不起作用。似乎我可以更改名称的唯一方法是重命名 getter,唯一的问题是第一个字母
放在变量上,而不是 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 放在变量声明上,以防您希望将其保留在默认范围内。
问题是我同时使用了旧的和新的 jackson 库
即在我有之前
import org.codehaus.jackson.annotate.JsonProperty;
为了与我使用的库保持一致,我不得不将其更改为以下内容。
由于我使用的是 Maven,这也意味着更新我的 Maven 依赖项。
import com.fasterxml.jackson.annotation.JsonProperty;
为了让它起作用,我需要 getter 上的 @JsonProperty
注释(将它放在对象上不起作用)
我在这里找到了答案(感谢 francescoforesti) @JsonProperty not working as expected
即使在定义了正确的注释之后,骆驼案例似乎仍然存在问题。 示例:
@JsonProperty("mirrorport") 私有字符串镜像端口;
当xml有<mirrorport>YES</mirrorport>
我有同样的问题
你只需要替换import 导入 com.fasterxml.jackson.annotation.JsonProperty; 在 导入 org.codehaus.jackson.annotate.JsonProperty; 它的工作。
我最近在这个问题上遇到了另一个有趣的转折。我们开始使用 Hibernate5Module 来帮助解决一些延迟加载问题。此外,我们使用 Groovy,所以我们没有定义 getters 和 setter。
事实证明,Hibernate 模块似乎干扰了 @JsonProperty
注释。特别是如果你有一些用 @Transient
注释的东西 那么,如果你有这样的东西:
@Transient
@ApiModelProperty(required = true)
@JsonProperty("alternateName")
String property
您不会在 JSON 中看到 alternateName
。此外,您的客户可能会遇到他们的 POST 和 PUT 问题!要解决此问题,您可以使用一个简单的解决方法。为您需要使用的内部名称定义 getters 和 setter(*),并且不要在 @JsonProperty
上使用 value
属性所以这有效:
@Transient
@ApiModelProperty(required = true)
@JsonProperty
String alternateName
void setProperty(String property) {
this.alternateName = property
}
@JsonIgnore
String getProperty() {
this.alternateName
}
注意 getter 上 @JsonIgnore
的使用。如果不这样做,您的框架可能会选择它,并且您的 JSON.
无论如何 - 我希望这对某人有所帮助!
(*)我们试图遵守一个特定的界面,从而在内部强制使用该名称。但是,公开的 API 需要一个不同的、用户友好的名称。
我在从旧版本更新到 FasterXML Jackson 2.8.3 时遇到了这个问题。
问题是在将来自我们数据库的 JSON 响应反序列化为 Java class 对象时,我们的代码在 [=28= 上没有 @JsonSetter
]' setters。因此,在序列化时,输出没有利用 class' getters 将 Java class 对象序列化为 JSON(因此 @JsonProperty()
装饰器没有生效)。
我通过将 @JsonSetter("name-from-db")
添加到 属性 的 setter 方法来解决这个问题。
此外,要使用 getter 方法重命名属性,您可以而且应该使用 @JsonGetter()
,而不是 @JsonProperty()
,它更适合重命名属性。
这是我们的代码:
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;
}
}
我缺少数据绑定依赖项
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${fasterxml.version}</version>
</dependency>
我知道这是一个老问题,但对我来说,当我发现它与 Gson 库冲突时,我就开始工作了,所以我不得不使用 @SerializedName("name")
而不是 @JsonProperty("name")
希望这有帮助
如果使用 Kotlin
我知道原来的问题在 Java 中,但是由于 Kotlin 变得非常流行并且许多人可能正在使用它,所以我想 post 在这里帮助其他人。
无论如何,对于 Kotlin,因为 getters/setters 的工作方式,如果您使用 val
,意味着您只公开 getter,您可能需要将注释应用于 getter 如下所示:
class JacksonTester(@get:JsonProperty("hello") val hi: String)
试试这个
class JacksonTester {
private String hi;
@JsonProperty("hi")
public String getHi() {
return hi;
}
}