Open jesjobom opened 5 years ago
I think I'm having the same problem. The issue occurs if there are no setters, if there are setters, it seems to work, but the following code throws an exception:
public class TestClass {
public static enum Colour {
GREEN, YELLOW, RED
}
public static class Fruit {
public String name;
public Colour colour = Colour.GREEN;
@Override
public String toString() {
return "Fruit [name=" + name + ", colour=" + colour + "]";
}
}
public static class FruitBasket {
List<Fruit> fruits;
@Override
public String toString() {
return "FruitBasket [fruits=" + fruits + "]";
}
}
/**
* @param args
*/
public static void main(String[] args) {
String jsonString = "{\"fruits\":[{\"name\":\"apple\",\"colour\":\"RED\"},{\"name\":\"banana\",\"colour\":\"YELLOW\"}]}";
FruitBasket basket = JsonIterator.deserialize(jsonString, FruitBasket.class);
System.out.println(basket);
}
}
This is the exception:
Exception in thread "main" com.jsoniter.spi.JsonException: java.lang.IllegalArgumentException: Can not set java.lang.String field com.base.json.TestClass$Fruit.name to com.base.json.TestClass$Colour
at com.jsoniter.ReflectionCollectionDecoder.decode(ReflectionCollectionDecoder.java:32)
at com.jsoniter.ReflectionObjectDecoder.decodeBinding(ReflectionObjectDecoder.java:376)
at com.jsoniter.ReflectionObjectDecoder.decodeBinding(ReflectionObjectDecoder.java:384)
at com.jsoniter.ReflectionObjectDecoder.access$700(ReflectionObjectDecoder.java:10)
at com.jsoniter.ReflectionObjectDecoder$OnlyField.decode_(ReflectionObjectDecoder.java:153)
at com.jsoniter.ReflectionObjectDecoder$OnlyField.decode(ReflectionObjectDecoder.java:119)
at com.jsoniter.JsonIterator.read(JsonIterator.java:385)
at com.jsoniter.JsonIterator.read(JsonIterator.java:375)
at com.jsoniter.JsonIterator.deserialize(JsonIterator.java:441)
at com.jsoniter.JsonIterator.deserialize(JsonIterator.java:411)
at com.base.json.TestClass.main(TestClass.java:45)
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.String field com.base.json.TestClass$Fruit.name to com.base.json.TestClass$Colour
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:75)
at java.lang.reflect.Field.set(Field.java:764)
at com.jsoniter.ReflectionObjectDecoder.setToBinding(ReflectionObjectDecoder.java:343)
at com.jsoniter.ReflectionObjectDecoder.access$400(ReflectionObjectDecoder.java:10)
at com.jsoniter.ReflectionObjectDecoder$OnlyField.decode_(ReflectionObjectDecoder.java:153)
at com.jsoniter.ReflectionObjectDecoder$OnlyField.decode(ReflectionObjectDecoder.java:119)
at com.jsoniter.ReflectionCollectionDecoder.decode_(ReflectionCollectionDecoder.java:47)
at com.jsoniter.ReflectionCollectionDecoder.decode(ReflectionCollectionDecoder.java:28)
... 10 more
JsonIter 0.9.23 JDK 1.8.0_181
When deserializing a list of objects (size > 1) with an enum attribute with default value it fails with "Can not set br.com.test.DummyType field br.com.test.Dummy.type to br.com.test.DummyType".
At second test...