2017-05-21 38 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