[英]How can I Serialize/De-serialize a Boolean Value from FasterXML\Jackson as an Int?
我正在為服務器編寫一個JSON客戶端,它將布爾值返回為“0”和“1”。 當我嘗試運行我的JSON客戶端時,我目前得到以下異常:
HttpMessageNotReadableException: Could not read JSON: Can not construct instance of java.lang.Boolean from String value '0': only "true" or "false" recognized
那么如何設置FasterXML \\ Jackson來正確解析類似的東西:
{
"SomeServerType" : {
"ID" : "12345",
"ThisIsABoolean" : "0",
"ThisIsABooleanToo" : "1"
}
}
樣本Pojo:
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({"someServerType"})
public class myPojo
{
@JsonProperty("someServerType")
SomeServerType someServerType;
@JsonProperty("someServerType")
public SomeServerType getSomeServerType() { return someServerType; }
@JsonProperty("someServertype")
public void setSomeServerType(SomeServerType type)
{ someServerType = type; }
}
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({"someServerType"})
public class SomeServerType
{
@JsonProperty("ID")
Integer ID;
@JsonProperty("ThisIsABoolean")
Boolean bool;
@JsonProperty("ThisIsABooleanToo")
Boolean boolToo;
@JsonProperty("ID")
public Integer getID() { return ID; }
@JsonProperty("ID")
public void setID(Integer id)
{ ID = id; }
@JsonProperty("ThisIsABoolean")
public Boolean getThisIsABoolean() { return bool; }
@JsonProperty("ThisIsABoolean")
public void setThisIsABoolean(Boolean b) { bool = b; }
@JsonProperty("ThisIsABooleanToo")
public Boolean getThisIsABooleanToo() { return boolToo; }
@JsonProperty("ThisIsABooleanToo")
public void setThisIsABooleanToo(Boolean b) { boolToo = b; }
}
休息客戶線
注1:這是使用Spring 3.2
注2: toJSONString() - 是一個使用Jackson來序列化我的參數對象的輔助方法
注3:在讀取結果對象時發生異常
DocInfoResponse result = restTemplate.getForObject(docInfoURI.toString()
+ "/?input={input}",
DocInfoResponse.class,
toJSONString(params));
正如Paulo Pedroso的回答中提到並引用的那樣,您將需要自己定制JsonSerializer
和JsonDeserializer
。 創建后,您需要將@JsonSerialize
和@JsonDeserialize
注釋添加到您的屬性中; 指定要用於每個的類。
我在下面提供了一個小的(希望直截了當的)示例。 串行器和解串器實現都不是非常強大,但這應該可以幫助您入門。
public static class SimplePojo {
@JsonProperty
@JsonSerialize(using=NumericBooleanSerializer.class)
@JsonDeserialize(using=NumericBooleanDeserializer.class)
Boolean bool;
}
public static class NumericBooleanSerializer extends JsonSerializer<Boolean> {
@Override
public void serialize(Boolean bool, JsonGenerator generator, SerializerProvider provider) throws IOException, JsonProcessingException {
generator.writeString(bool ? "1" : "0");
}
}
public static class NumericBooleanDeserializer extends JsonDeserializer<Boolean> {
@Override
public Boolean deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException {
return !"0".equals(parser.getText());
}
}
@Test
public void readAndWrite() throws JsonParseException, JsonMappingException, IOException {
ObjectMapper mapper = new ObjectMapper();
// read it
SimplePojo sp = mapper.readValue("{\"bool\":\"0\"}", SimplePojo.class);
assertThat(sp.bool, is(false));
// write it
StringWriter writer = new StringWriter();
mapper.writeValue(writer, sp);
assertThat(writer.toString(), is("{\"bool\":\"0\"}"));
}
而不是自定義反序列化器,您也可以簡單地使用如下的setter:
public void setThisIsABoolean(String str) {
if ("0".equals(str)) {
bool = false;
} else {
bool = true;
}
}
因為您的方法可以聲明與您在內部使用的類型不同的類型。
如果您必須同時支持Boolean
和String
,則可以指示value是一個Object
,並檢查您可能獲得的內容。
甚至可以為getter方法( Boolean
)和setter( String
或Object
)設置不同的類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.