Serialization 布尔序列化为字符串错误

Serialization 布尔序列化为字符串错误,serialization,spring-boot,Serialization,Spring Boot,我有一个这样的财产: @CatalogExportField(columnName = "K", headerName = "catalog name") private Boolean mpAvailable; 我需要在其他类中解析时将其作为字符串 private CatalogExportDto convert(Variant variant, boolean willHaveProductTypeFields) { CatalogExportDto dto = ne

我有一个这样的财产:

    @CatalogExportField(columnName = "K", headerName = "catalog name")
private Boolean mpAvailable;
我需要在其他类中解析时将其作为字符串

   private CatalogExportDto convert(Variant variant, boolean willHaveProductTypeFields) {
    CatalogExportDto dto = new CatalogExportDto()


        .setMpAvailable(variant.isMpAvailable())
但这里是布尔值

但找不到合适的例子

这也是

catalog export field.java


@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface CatalogExportField {

    String color() default "#56aaff";

    String columnName() default "";

    String headerName() default "";

    String displayName() default "";
}
在搜索之后,我做了一些操作,得到了错误:

Problem deserializing property 'MpAvailable' (expected type: [simple type, class java.lang.Boolean]; actual type: java.lang.String), problem: argument type mismatch at [Source: java.io.FileInputStream@1f40904; line: 1, column: 720] (through reference chain: java.util.ArrayList[0]->domain.util.CatalogExportDto["MpAvailable"])
为了

这是目录中的导出dto

    @JsonDeserialize(using = BooleanDeserializer.class)
@JsonProperty("MpAvailable")
@CatalogExportField(columnName = "K", headerName = "catalog.export.mp_available")
private Boolean mpAvailable;
这是反序列化程序

public class BooleanDeserializer extends JsonDeserializer<String> {
protected static final String NO = "no";
protected static final String YES = "yes";

@Override
public String deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
    JsonToken currentToken = jp.getCurrentToken();

    if (currentToken.equals(JsonToken.VALUE_FALSE)) {
        return NO;

    }
        return YES;
}
}

} }

我出错了

Can not deserialize value of type java.lang.Boolean from String "no": only "true" or "false" recognized at [Source: java.io.FileInputStream@1d1ec976; line: 1, column: 534] (through reference chain: java.util.ArrayList[0]->CatalogExportDto["mpAvailable"])

一对无序的想法:

  • 当您编写
    JsonDeserializer
    时,您可能会说将由您的类从JSON中反序列化
    字符串。事实上,您想要反序列化到某个奇怪的自己的类型,或者
    布尔值
    ,但不是
    字符串
    ,这是肯定的
  • 如果您通过写“是”或“否”来序列化,那么您将通过比较“是”或“否”来反序列化。但是您可以将其与
    JsonToken.VALUE\u FALSE
    进行比较,后者很可能是“FALSE”或其他什么
  • 但是,您的反序列化方法可能根本没有运行:因为它可能会得到一些“yes”/“no”文本,并将其与“false”进行比较,所以比较将失败,因此该方法将返回yes(“yes”),而错误消息则抱怨得到了“no”
除了写作,我对春天和靴子一无所知

public class BooleanDeserializer extends JsonDeserializer<Boolean> {
protected static final String NO = "no";
protected static final String YES = "yes";

  @Override
  public Boolean deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
    JsonToken currentToken = jp.getCurrentToken();
    return currentToken.equals(YES);
  }
}
公共类BooleanDeserializer扩展JsonDeserializer{
受保护的静态最终字符串NO=“NO”;
受保护的静态最终字符串YES=“YES”;
@凌驾
公共布尔反序列化(JsonParser jp,反序列化上下文ctxt)引发IOException{
JsonToken currentToken=jp.getCurrentToken();
返回currentToken.equals(是);
}
}
也许是个更好的开始。然而,我真的不知道是否会调用它,因为JSON已经有了自己的布尔反序列化程序。
据我所知,您可能更希望在自己的类中使用这种反序列化功能。

java.lang。ThreadLocal@1d9a65d3作为它的输出。不是否或是:(@tevemadar@mark可能我不理解这个目标。到目前为止,我看到的是,您在某处有一个布尔字段,出于某种原因,您在JSON中将其序列化为“是”或“否”,但无法读回(反序列化)。但是,现在您的评论可能意味着JSON本身包含该字符串化线程引用。在这种情况下,必须重新访问序列化部分,反序列化就在前面。我想使用是或否,而不是真或假。值是布尔值,但我想使用是或否
Can not deserialize value of type java.lang.Boolean from String "no": only "true" or "false" recognized at [Source: java.io.FileInputStream@1d1ec976; line: 1, column: 534] (through reference chain: java.util.ArrayList[0]->CatalogExportDto["mpAvailable"])
public class BooleanDeserializer extends JsonDeserializer<Boolean> {
protected static final String NO = "no";
protected static final String YES = "yes";

  @Override
  public Boolean deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
    JsonToken currentToken = jp.getCurrentToken();
    return currentToken.equals(YES);
  }
}