boolean serializing to string error

时间:2017-05-21 15:59:58

标签: serialization spring-boot

我有这样的房产:

    @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"])

这是在catalogexport 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;
}

}

我现在改为现在

public class YesNoBooleanSerializer扩展了JsonSerializer {

protected static final String NO = "no";
protected static final String YES = "yes";

@Override
public void serialize(Boolean b, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
    jsonGenerator.writeString(b ? NO : YES);
}

}

}     }

字段

@JsonSerialize(using = YesNoBooleanSerializer.class)
@CatalogExportField(columnName = "K", headerName = "catalog.export.mp_available")
private Boolean mpAvailable;

我收到了错误

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"])

1 个答案:

答案 0 :(得分:1)

一对无序的人:

  • 当你写JsonDeserializer<String>时,可能你会说你的类会从JSON反序列化String - s。实际上你想要反序列化为某种奇怪的自有类型,或者Boolean,而不是String,这是肯定的
  • 如果你通过写作序列化&#34;是&#34;或者&#34;不&#34;,你会通过比较&#34;是&#34;来反序列化。或&#34;不&#34;。但是你比较JsonToken.VALUE_FALSE,这很可能是&#34;假&#34;
  • 然而你的反序列化方法可能根本没有运行:因为它可能会得到一些&#34;是&#34; /&#34; no&#34;文本,并将其与&#34; false&#34;进行比较,比较将失败,因此该方法将返回YES(&#34; yes&#34;),而错误消息则抱怨获得&#34; no& #34;

我对Spring或Boot一无所知,但写作

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);
  }
}

可能是一个更好的开始。但是我真的不知道是否会调用它,因为JSON肯定有自己的布尔反序列化器。 根据{{​​3}},您可能更愿意将此反序列化内容用于您自己的类。