2017-05-21 18 views
0

我有一个属性是这样的:布尔序列化到字符串错误

@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: [email protected]; 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; 
} 

}

我改变了这个现在

公共类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: [email protected]; line: 1, column: 534] (through reference chain: java.util.ArrayList[0]->CatalogExportDto["mpAvailable"]) 

回答

1

一对夫妇无序thougts:

  • 当你写JsonDeserializer<String>,也许你说,这将是你的类反序列化String -s来自JSON。其实你想反序列化为一些奇怪的自己的类型,或者Boolean,但不是String,这是肯定的
  • 如果通过编写“是”或“否”来序列化,您将通过与“是”进行反序列化或“没有”。但是,你比较JsonToken.VALUE_FALSE,这很可能是“假”或什么
  • 但是你的反序列化方法可能根本没有运行:因为它可能会得到一些“是”/“否”文本,并将其与“假” ,比较会失败,因此该方法将返回YES(“是”),而该错误消息抱怨得到一个“不”

我什么都不知道Spring或引导,但写

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已经有了自己的布尔解串器。 根据Right way to write JSON deserializer in Spring or extend it,您可能更希望将这种反序列化的东西用于您自己的类。

+0

[email protected]作为它给出的输出。不是,或者是:(@tevemadar – mark

+0

@mark可能我不明白这个目标,到目前为止我所看到的是你在某个地方有一个布尔字段,并且出于某种原因,你将它序列化为“是”或“否” JSON,但不能读取它(反序列化)。但是现在你的注释可能意味着JSON本身包含了字符串化的线程引用,在这种情况下,序列化部分必须被重新访问,并且反序列化会在前面。 – tevemadar

+0

我想要使用是或否,不是真或假。值是布尔值,但我想用它作为是或否 – mark