我遇到从外部源接收到布尔值(字符串“ 0”或“ 1”)的情况。映射时,Jackson不会对此进行娱乐,并引发以下错误:
InvalidFormatException:无法反序列化类型为
boolean
的值来自字符串“ 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());
}
}
但是我需要与构建器一起工作并按如下方式编写。这不再起作用。它引发与上述相同的错误。有没有一种方法可以使构建器进行自定义反序列化?请注意,除非完全不可能,否则我将坚持使用Lombok的Builder。谢谢。
与构建器一起使用时失败的示例。 (我想对其进行修复以使其正常工作)
@Getter
@JsonDeserialize(builder = MyClass.MyClassBuilder.class)
@Builder
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());
}
}
快速测试用例,可以根据需要进行测试。
public class ATest {
@Test
public void myTest() throws IOException {
ObjectMapper mapper = new ObjectMapper();
// test passes if MyClass doesn't use builder.
MyClass myClass = mapper.readValue("{\"bool\":\"1\"}", MyClass.class);
assertTrue(myClass.isBool());
}
}
您可以使用@JsonSetter
...]
尝试一下:
@Getter @Builder @AllArgsConstructor @NoArgsConstructor public class MyClass { @JsonDeserialize(using = NumericBooleanDeserializer.class) @JsonProperty("bool") private boolean bool; // many other fields @JsonSetter public void setBool(String value) { this.bool = "1".equals(value) ? true : false; } }
或仅添加
@AllArgsConstructor
和@NoArgsConstructor
:
@Getter
@JsonDeserialize(builder = MyClass.MyClassBuilder.class)
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class MyClass {
@JsonDeserialize(using = NumericBooleanDeserializer.class)
@JsonProperty("bool")
private boolean bool;
// many other fields
}