mdewilde / chart

Java library for use with Chart.js javascript library
Apache License 2.0
112 stars 43 forks source link

Parsing json to Java classes is not working #6

Open vishal3007 opened 6 years ago

vishal3007 commented 6 years ago

Hi,

I am trying to parse the chart json to the BarChart.java class using jackson library and getting the following error: Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Conflicting setter definitions for property "padding": be.ceau.chart.options.layout.Layout#setPadding(1 params) vs be.ceau.chart.options.layout.Layout#setPadding(1 params) at [Source: C:\Vishal\chart.json; line: 1, column: 1] at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:305) at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:268) at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244) at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142) at com.fasterxml.jackson.databind.DeserializationContext.findContextualValueDeserializer(DeserializationContext.java:443) at com.fasterxml.jackson.databind.deser.std.StdDeserializer.findDeserializer(StdDeserializer.java:964) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:498) at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:293) at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244) at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142) at com.fasterxml.jackson.databind.DeserializationContext.findContextualValueDeserializer(DeserializationContext.java:443) at com.fasterxml.jackson.databind.deser.std.StdDeserializer.findDeserializer(StdDeserializer.java:964) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:498) at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:293) at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244) at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142) at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:476) at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:3899) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3794) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2740) at TestChart.main(TestChart.java:13) Caused by: java.lang.IllegalArgumentException: Conflicting setter definitions for property "padding": be.ceau.chart.options.layout.Layout#setPadding(1 params) vs be.ceau.chart.options.layout.Layout#setPadding(1 params) at com.fasterxml.jackson.databind.introspect.POJOPropertyBuilder.getSetter(POJOPropertyBuilder.java:323) at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.filterBeanProps(BeanDeserializerFactory.java:602) at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.addBeanProps(BeanDeserializerFactory.java:497) at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:226) at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:141) at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:403) at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:349) at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264) ... 19 more

The root cause seems to be overloading of the setPadding method in Layout class, which is confusing the jackson library. ObjectMapper mapper = new ObjectMapper(); BarChart chart = mapper.readValue(new File("C:\\Vishal\\chart.json"), BarChart.class);

FYI: I am using 2.6.0 version of chart.js and 2.3.0 version of your library. Please find the attached json file which is being parsed. chart.txt

Thanks, Vishal

mdewilde commented 6 years ago

Thank you for the report. I hadn't considered that deserializing json charts may be useful to some, so as you discovered, this behavior is lacking.

I've added a test to take a look at how this behavior could be enabled: https://github.com/mdewilde/chart/blob/99dc1123eddc7b5b4ba076dff0d0c6540c5f6ef0/src/test/java/be/ceau/chart/tests/DeserializeTest.java

At this point, there appear to still be many issues, but I agree that adding this would be a nice feature.