使用构建器时无法执行自定义反序列化

问题描述 投票:2回答:1

我遇到从外部源接收到布尔值(字符串“ 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());
    }
}
java jackson lombok
1个回答
0
投票

您可以使用@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
}
© www.soinside.com 2019 - 2024. All rights reserved.