JSONで取得したブール値の一部を逆シリアル化する必要があります。問題は、それらの値がnull、true、false、 "true"、false、 "Y"または "N"のいずれかである可能性があることです。ジャクソンカスタムブールjsonプロパティの逆シリアル化
私はこのようにそれを登録した場合
public class CustomBooleanDeserializer extends JsonDeserializer<Boolean> {
final protected Class<?> _valueClass = Boolean.class;
@Override
public Boolean deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException,
JsonProcessingException {
return _parseBooleanPrimitive2(jp, ctxt);
}
protected final boolean _parseBooleanPrimitive2(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
LogUtils.d("PARSE BOOLEAN");
JsonToken t = jp.getCurrentToken();
if (t == JsonToken.VALUE_TRUE) {
return true;
}
if (t == JsonToken.VALUE_FALSE) {
return false;
}
if (t == JsonToken.VALUE_NULL) {
return false;
}
if (t == JsonToken.VALUE_NUMBER_INT) {
return (jp.getIntValue() != 0);
}
if (t == JsonToken.VALUE_STRING) {
String text = jp.getText().trim();
if ("true".equals(text)) {
return true;
}
if ("false".equals(text) || text.length() == 0) {
return Boolean.FALSE;
}
if ("N".equalsIgnoreCase(text) || text.length() == 0) {
return Boolean.FALSE;
}
if ("Y".equalsIgnoreCase(text)) {
return Boolean.TRUE;
}
throw ctxt.weirdStringException(_valueClass, "only \"true\" or \"false\" recognized");
}
// Otherwise, no can do:
throw ctxt.mappingException(_valueClass);
}
しかし、このデシリアライザが呼び出されることはありません自分のブールデシリアライザを作成しました:一方で、私は@JsonDeserialize(using = CustomBooleanDeserializer.class)
を使用し、場合
Version version = new Version(1, 0, 0, "SNAPSHOT");
SimpleModule module = new SimpleModule("MyModuleName", version);
module = module.addDeserializer(new CustomBooleanDeserializer());
objectMapper.registerModule(module);
ブール値のフィールドの場合、呼び出され、うまく動作します。唯一の問題は、プロパティがnullの場合、私はこの例外を取得することです:
org.codehaus.jackson.map.JsonMappingException:問題 プロパティをデシリアライズ「show_query_cond」(予想タイプ:[単純型、クラス ブール];実際のタイプ:[NULL])、問題:フィールド に無効な値(基準チェーンを介し:com.csf.model.CSTable [ "show_query_cond"])
したがって、ブールプロパティがnullの場合、私のデシリアライザは動作する機会を得られません。また、私はmapper.configure(DeserializationConfig.Feature.FAIL_ON_NULL_FOR_PRIMITIVES, false);
を使ってみましたが、@ JsonDeserializeアノテーションを使用すると例外がスローされます。
誰でもこの作業を行う方法を知っていますか?