JsonProperty
不会覆盖杰克逊从getter获取的默认名称。如果我使用ObjectMapper
和杰克逊序列化下面的课程,我会得到
{"hi":"hello"}
如您所见,JsonProperty注释无效
class JacksonTester {
String hi;
@JsonProperty("hello")
public String getHi() {
return hi;
}
}
将@JsonProperty
放在String本身上也不起作用。似乎我可以更改名称的唯一方法是重命名getter,唯一的问题是它的第一个字母总是小写
答案 0 :(得分:23)
问题在于我正在使用旧的和新的杰克逊库
即。在我之前
import org.codehaus.jackson.annotate.JsonProperty;
我必须改为以下,以便与我使用的库保持一致。
因为我使用maven也意味着更新我的maven依赖项。
import com.fasterxml.jackson.annotation.JsonProperty;
要使它工作,我需要在getter上使用@JsonProperty
注释(将它放在对象上不起作用)
我在这里找到答案(感谢francescoforesti) @JsonProperty not working as expected
答案 1 :(得分:3)
从旧版本更新到FasterXML Jackson的2.8.3时,我遇到了这个问题。
问题在于,当我们将数据库中的JSON响应反序列化为Java类对象时,我们的代码在类中没有@JsonSetter
。 setter方法。因此,在序列化时,输出不是利用类#39; 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;
}
}
答案 2 :(得分:2)
我有同样的问题
您只需要替换导入即可 import com.fasterxml.jackson.annotation.JsonProperty; 上 import org.codehaus.jackson.annotate.JsonProperty; 它的工作。
答案 3 :(得分:2)
我知道这是一个老问题,但是当我发现它与Gson库冲突时,对我来说我可以使用它,所以我不得不使用scnnode
而不是UIPanGestureRecognizer
希望对您有所帮助
答案 4 :(得分:1)
即使在定义了正确的注释之后,Camel案例似乎仍然存在问题。 例如:
@JsonProperty( “mirrorport”) private String mirrorPort;
当xml具有<mirrorport>YES</mirrorport>
答案 5 :(得分:0)
将它放在变量上,而不是放置器
class JacksonTester {
@JsonProperty("hello")
private String hi;
public String getHi() {
return hi;
}
}
答案 6 :(得分:0)
你试过下面的
class JacksonTester {
private String hi;
@JsonProperty("hello")
public String getHi() {
return hi;
}
}
我的意思是将'hi'变量声明设为私有。 或者尝试在变量声明上放置@JsonIgnore,以防您将其保留在默认范围内。
答案 7 :(得分:0)
我最近在这个问题上遇到了另一个有趣的转折点。我们开始使用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
}
请注意在getter上使用@JsonIgnore
。如果不这样做,您的框架可能会选择它,并且您的JSON中的相同内容也会有重复的条目。
无论如何 - 我希望这有助于某人!
(*)我们试图遵循特定的接口,从而在内部强制执行名称。但是,公开的API需要一个不同的,用户友好的名称。
答案 8 :(得分:0)
我缺少数据绑定依赖项
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${fasterxml.version}</version>
</dependency>
答案 9 :(得分:0)
如果使用Kotlin
我知道最初的问题是在Java中,但是由于Kotlin变得非常流行,并且许多人可能正在使用它,因此我想在这里发布此内容以帮助其他人。
无论如何,对于Kotlin而言,因为吸气剂/塞特剂的工作方式,如果您使用的是val
,这意味着您仅公开吸气剂,则可能需要像下面这样将注释应用于吸气剂:
class JacksonTester(@get:JsonProperty("hello") val hi: String)
答案 10 :(得分:0)
尝试一下
class JacksonTester {
private String hi;
@JsonProperty("hi")
public String getHi() {
return hi;
}
}