【问题标题】:@JsonProperty seems to only work for non boolean members@JsonProperty 似乎只适用于非布尔成员
【发布时间】:2018-04-27 20:41:52
【问题描述】:

我有一个我正在尝试映射到 JSON 的对象,除了布尔成员之外,一切似乎都运行良好,如下所示:

public class Foo implements Serializable {

    @JsonProperty("this_does_not_work")
    private boolean isBar;

    @JsonProperty("this_works")
    private int bar;

    @JsonProperty("this_works_too")
    public boolean isBar() {
        return isBar;
    }

}

这将被序列化为:

{
    this_works: ...,
    this_works_too: ...    
}

为什么布尔成员不能有 @JsonProperty(但他们的 getter 有)?

【问题讨论】:

  • 如果把方法改成getBar(),会不会和名字冲突?
  • 为我工作,在 json 中打印 3 个字段。清理,重新编译,重试
  • @AdamSkywalker 它确实打印了 3 个字段,但这只是一个示例。请删除第三个@JsonProperty(来自getter)并告诉我它是否序列化为this_does_not_workthis_works 属性:)
  • 我复制了一些奇怪的案例,但肯定是由变量命名引起的。你能提供一个有问题的真实样本吗?我不想调查为什么具有相同名称和随机方法的 int 和 boolean 变量最终会发生冲突
  • @AdamSkywalker 确定!这是:pastebin.com/EBd6KQ6t(这是最接近“真实”的东西,但为了简单起见,我仍然隐藏了一些属性)。同样,我很清楚,您只能通过在其 getter 上使用 @JsonProperty 来重命名 [BOOLEAN!] 属性(不太可能适用于所有其他类型)。感谢您的帮助!

标签: java json serialization fasterxml


【解决方案1】:

总结来自 cmets 的语句:如果您将布尔字段名称更改为 enabled

@JsonProperty("custom_name")
private boolean enabled;

public boolean isEnabled() {
    return enabled;
}

public void setEnabled(boolean isEnabled) {
    this.enabled = isEnabled;
}

它将提供所需的输出{ "custom_name" : true }

原来的问题是不遵循java字段命名约定:

@JsonProperty("custom_name")
@Column(name = "fl_enabled")
private boolean isEnabled;

public boolean isEnabled() {
    return isEnabled;
}

public void setEnabled(boolean isEnabled) {
    this.isEnabled = isEnabled;
}

当 FasterXML 序列化一个对象时,它会查找字段和 getter。

在您的情况下,它找到了布尔字段 isEnabled 并使用 custom_name 对其进行了序列化。

然后它从处理中排除了这个布尔字段的 getter - 可能要排除的 getter 名称是 getIsEnabled 和 'isIsEnabled' - 你没有。

然后它找到方法isEnabled,它看起来像字段enabled 的getter。所以它获取它的值并用键enabled序列化它。

同样,问题是您不应该使用前缀is 命名布尔字段。

【讨论】:

  • 以某种方式确实解决了它,这就是我接受它的原因,但是我不太明白为什么命名约定与它有关(尽管它被错误地命名了)。介意深入解释一下吗?
  • @YvesHenri 添加了一步一步的解释,以为很清楚
  • 知道了!谢谢!
【解决方案2】:

对于最终出现在此处的其他任何人:这也可能是由不正确的导入引起的。

就我而言,我应该使用:

import com.fasterxml.jackson.annotation.JsonProperty;

但是我错误地导入了

import org.codehaus.jackson.annotate.JsonProperty;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 2021-06-24
    • 2021-04-14
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    相关资源
    最近更新 更多