As it seems, the @JsonIgnore annotation is ignored if an @JsonCreator annotated constructor is present.
The following test
public class JsonIterTest {
@BeforeClass
public static void setUp() {
JsonIterator.setMode(DecodingMode.REFLECTION_MODE);
}
public static class TestObject {
String field1;
@JsonIgnore
ActionListener fieldXXX;
@JsonCreator
public TestObject(@JsonProperty("field2") String field) {
field1 = null;
fieldXXX = e -> System.out.println("field2 is " + field);
}
@Override
public String toString() {
return "field1=" + field1 + ", field2=" + fieldXXX;
}
}
@Test
public void simpleParsingTest() throws IOException {
JsonIterator iter = JsonIterator.parse("{\"field2\": \"test\"}");
TestObject t = iter.read(TestObject.class);
System.out.println(t);
}
}
fails with:
java.lang.IllegalArgumentException: Can not set java.awt.event.ActionListener field de.q2web.db.io.json.RuleConfigTest$TestObject.field2 to java.lang.String
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81)
at java.lang.reflect.Field.set(Field.java:764)
...
In addition i observed that:
- If we remove the @JsonIgnore annotation, the following exception is thrown:
com.jsoniter.spi.JsonException: no constructor for: interface java.awt.event.ActionListener
at com.jsoniter.ReflectionObjectDecoder.init(ReflectionObjectDecoder.java:45)
...
-
If the line ActionListener fieldXXX; is transformed to String fieldXXX; and the line fieldXXX = e -> System.out.println(field); is removed, no exception is thrown, however the console output yields field1=null, field2=test instead of field1=null, field2=null.
-
In dynamic decoding mode (DecodingMode.DYNAMIC_MODE_AND_MATCH_FIELD_WITH_HASH) everything works fine.
Edit: forgot to mention that I use jsoniter:0.9.18 with javassist:3.20.0-GA ;)
As it seems, the @JsonIgnore annotation is ignored if an @JsonCreator annotated constructor is present.
The following test
fails with:
In addition i observed that:
If the line
ActionListener fieldXXX;is transformed toString fieldXXX;and the linefieldXXX = e -> System.out.println(field);is removed, no exception is thrown, however the console output yieldsfield1=null, field2=testinstead offield1=null, field2=null.In dynamic decoding mode (
DecodingMode.DYNAMIC_MODE_AND_MATCH_FIELD_WITH_HASH) everything works fine.Edit: forgot to mention that I use
jsoniter:0.9.18withjavassist:3.20.0-GA;)