Java 使用生成器时无法执行自定义反序列化
在这种情况下,我从外部源接收一个布尔值,作为字符串“0”或“1”。 映射时,Jackson不考虑这一点,并抛出以下错误: InvalidFormatException:无法反序列化类型为Java 使用生成器时无法执行自定义反序列化,java,jackson,lombok,Java,Jackson,Lombok,在这种情况下,我从外部源接收一个布尔值,作为字符串“0”或“1”。 映射时,Jackson不考虑这一点,并抛出以下错误: InvalidFormatException:无法反序列化类型为布尔值的值 从字符串“1” 因此,我正在进行以下自定义反序列化,这是有效的 在没有构建器的情况下完成的工作示例 @Getter public class MyClass { @JsonDeserialize(using = NumericBooleanDeserializer.class) @J
布尔值的值
从字符串“1”
因此,我正在进行以下自定义反序列化,这是有效的
在没有构建器的情况下完成的工作示例
@Getter
public class MyClass {
@JsonDeserialize(using = NumericBooleanDeserializer.class)
@JsonProperty("bool")
private boolean bool;
// many other fields
}
class NumericBooleanDeserializer extends JsonDeserializer<Boolean> {
@Override
public Boolean deserialize(JsonParser parser, DeserializationContext context) throws IOException {
return "1".equals(parser.getText());
}
}
编辑:根据下面的答案尝试建议的选项
备选案文1:
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class MyClass {
@JsonDeserialize(using = NumericBooleanDeserializer.class)
@JsonProperty("bool")
private boolean bool;
// many other fields
@JsonSetter
private void setBool(String value){
this.bool = "1".equals(value);
}
}
class NumericBooleanDeserializer extends JsonDeserializer<Boolean> {
@Override
public Boolean deserialize(JsonParser parser, DeserializationContext context) throws IOException {
return !"0".equals(parser.getText());
}
}
获取以下错误:
com.fasterxml.jackson.databind.exc.InvalidFormatException:无法
从字符串“1”反序列化类型为布尔值的值:仅“true”或
在[Source:(String)“{”bool:“1”}”行识别“false”;第1行,
列:9](通过引用链:
a、 a.a.MyClass$MyClassBuilder[“bool”])
更新2020-11-03:Lombok 1.18.16发布
从Lombok 1.18.16开始,您可以使用@Jacksonized
自动生成Jackson使用Lombok@(超级)生成器所需的所有内容
:
@Getter
@Jacksonized
@Builder
public class MyClass {
@JsonDeserialize(using = NumericBooleanDeserializer.class)
private boolean bool;
// many other fields
}
对于早期的Lombok版本,必须自定义生成器,以便将注释添加到生成器的setter方法中。在您的情况下,它的工作原理如下:
@Getter
@Builder
@JsonDeserialize(builder = MyClass.MyClassBuilder.class)
public class MyClass {
private boolean bool;
// many other fields
public static class MyClassBuilder {
@JsonDeserialize(using = NumericBooleanDeserializer.class)
@JsonProperty("bool")
public MyClassBuilder bool(boolean bool) {
this.bool = bool;
return this;
}
}
}
Lombok认识到构建器已经有了一个类定义,并且只为您没有手动实现的方法生成代码。Perfect this works!但是,考虑到现在已经为bool方法添加了注释,我可以说不再需要对字段本身进行注释了吗?当我删除bool变量的注释时,它运行良好。想确认是否有任何理由在两端加上注释?是的。我只是将注释放在那里以保持一致性,但如果您只是使用反序列化,则不需要注释。我更新了答案(删除了字段上的注释)。我使用新的@Jacksonized
方法(使用lombok>=1.18.16)更新了答案。我要感谢您的回答。成功了!但是,我有两个带有生成器注释的模型。其中一个模型(仅包含字符串变量)被反序列化而没有任何问题。对于一个模型(它只包含一个链表),我必须添加这个@Jacksonized来反序列化它。为什么?
@Getter
@JsonDeserialize(builder = MyClass.MyClassBuilder.class)
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class MyClass {
@JsonDeserialize(using = NumericBooleanDeserializer.class)
@JsonProperty("bool")
private boolean bool;
}
@Getter
@Jacksonized
@Builder
public class MyClass {
@JsonDeserialize(using = NumericBooleanDeserializer.class)
private boolean bool;
// many other fields
}
@Getter
@Builder
@JsonDeserialize(builder = MyClass.MyClassBuilder.class)
public class MyClass {
private boolean bool;
// many other fields
public static class MyClassBuilder {
@JsonDeserialize(using = NumericBooleanDeserializer.class)
@JsonProperty("bool")
public MyClassBuilder bool(boolean bool) {
this.bool = bool;
return this;
}
}
}