JsonArrayをブール値にデシリアライズする必要があります。配列が存在し、空でない場合、値は "true"に設定する必要があります。 問題は、私のカスタムデシリアライザは、機能している間に残りのフィールドのデシリアライズを解除することです。それらはnullに設定されています。Jacksonカスタムデシリアライザが他のフィールドのデシリアライズを解除する
オブジェクト:
private static class TestObject {
private String name;
@JsonProperty("arr")
@JsonDeserialize(using = Deserializer.class)
private Boolean exists = null;
private Integer logins;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Boolean getExists() {
return exists;
}
public void setExists(boolean exists) {
this.exists = exists;
}
public Integer getLogins() {
return logins;
}
public void setLogins(Integer logins) {
this.logins = logins;
}
@Override
public String toString() {
return "TestObject{" +
"name='" + name + '\'' +
", exists=" + exists +
", logins=" + logins +
'}';
}
}
デシリアライザ:
public class Deserializer extends JsonDeserializer<Boolean> {
@Override
public Boolean deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException {
if (jp.getCurrentToken() == JsonToken.START_ARRAY) {
return true;
}
return false;
}
}
テスト
@Test
public void test() throws JsonParseException, IOException {
Boolean result = deserialize();
}
private Boolean deserialize() throws IOException, JsonParseException,
JsonProcessingException {
TestObject testObject = mapper.readValue("{\n" +
" \"arr\": [\n" +
" {\"value\": \"New\"}\n" +
" ],\n" +
" \"name\": \"name\",\n" +
" \"logins\": 36" +
"}",
TestObject.class);
System.out.println(testObject.toString());
return testObject.getExists();
}
私は "ARR" のアレイを削除するか、JSONの一番下に移動し、すべての罰金場合。私がトップに残したら - TestObject{name='null', exists=true, logins=null}
。
同様の質問(Jackson Custom Deserializer breaks default ones)がありましたが、残念ながらゼロの回答があります。 Jsonを再配置するとコードが正常に動作するので、カスタムデシリアライザがすべてのフィールドで使用されているのではなく、Jacksonがカスタムデシリアライザを実行するときに逆シリアル化を停止します。
私の提案は、配列をブール値にデシリアライズしないことです。配列をリスト/リスト/セットにデシリアライズし、 'getExists'が' arr!= null'かそのようなものを返すようにします。 – Paul
@Paulこれは実際には、アイデアのおかげで、何とか私はそれを考えていない動作します。問題は、それがちょっと醜く、あいまいに見えますが、それ以外の方法がなければ、私はそれをそうするでしょう。 –
場合によっては、2つの醜い解決策のよりきれいなものを選択する必要があります:)私は私が助けることができてうれしいです...私は答えを私のコメントにします。 – Paul