I seem to be quite stuck on how to desearilize an arrays of arrays. I'm quite new to these tools to mess around with JSON files, I was able to desearilize the JSON coming from the REST API of countries (https://restcountries.eu/rest/v2/all) but I'm now trying to deserialize this from the Open Sky API (https://opensky-network.org/api/states/all?lamin=45.8389&lomin=5.9962&lamax=47.8229&lomax=10.5226) and it comes with an array of arrays (not an array of objects) and those arrays come with strings and ints.
I have this class :
@JsonIgnoreProperties
public class Plane {
private String icao24;
private String callsign;
private String origin_country;
private int time_position;
private int last_contact;
private float longitude;
private float latitude;
private float baro_altitude;
private boolean on_ground;
private float velocity;
private float true_track;
private float vertical_rate;
private int[] sensors;
private float geo_altitude;
private String squawk;
private boolean spi;
private int position_source;
}
with getters and setters
and this one:
@JsonIgnoreProperties
public class SkyResponseObject {
private Plane[][] states;
}
and this method that does the API call:
public SkyResponseObject getJson(String parameters){
return restTemplate.getForObject(URL+parameters,SkyResponseObject.class);
}
but jackson seems to be throwing errors, have already tried multiple combination of things but can't get it to work, some help would be appreciated:
Example of error thrown:
Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/annotation/JsonKey
at com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector.hasAsKey(JacksonAnnotationIntrospector.java:1080)
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector._addFields(POJOPropertiesCollector.java:495)
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.collectAll(POJOPropertiesCollector.java:421)
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.getPropertyMap(POJOPropertiesCollector.java:386)
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.getProperties(POJOPropertiesCollector.java:233)
at com.fasterxml.jackson.databind.introspect.BasicBeanDescription._properties(BasicBeanDescription.java:164)
at com.fasterxml.jackson.databind.introspect.BasicBeanDescription.findProperties(BasicBeanDescription.java:239)
at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._findCreatorsFromProperties(BasicDeserializerFactory.java:328)
at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._constructDefaultValueInstantiator(BasicDeserializerFactory.java:272)
at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory.findValueInstantiator(BasicDeserializerFactory.java:223)
at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:261)
at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:150)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:414)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:349)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264)
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:591)
at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:4733)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4594)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3601)
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:378)
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:342)
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:105)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:778)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:711)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:334)
at com.labproject.SkyTracker.OpenSky.OpenSkyController.getJson(OpenSkyController.java:25)
at com.labproject.SkyTracker.SkyTrackerApplication.main(SkyTrackerApplication.java:23)
EDIT: After doing the suggested in the comment my error is now this:
Exception in thread "main" org.springframework.web.client.RestClientException: Error while extracting response for type [class com.labproject.SkyTracker.OpenSky.SkyResponseObject] and content type [application/json;charset=UTF-8]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize a POJO (of type `com.labproject.SkyTracker.OpenSky.Plane`) from non-Array representation (token: VALUE_STRING): type/property designed to be serialized as JSON Array; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize a POJO (of type `com.labproject.SkyTracker.OpenSky.Plane`) from non-Array representation (token: VALUE_STRING): type/property designed to be serialized as JSON Array
at [Source: (PushbackInputStream); line: 1, column: 31] (through reference chain: com.labproject.SkyTracker.OpenSky.SkyResponseObject["states"]->java.lang.Object[][0]->java.lang.Object[][0])
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:120)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:778)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:711)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:334)
at com.labproject.SkyTracker.OpenSky.OpenSkyController.getJson(OpenSkyController.java:25)
at com.labproject.SkyTracker.SkyTrackerApplication.main(SkyTrackerApplication.java:23)
Caused by: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize a POJO (of type `com.labproject.SkyTracker.OpenSky.Plane`) from non-Array representation (token: VALUE_STRING): type/property designed to be serialized as JSON Array; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize a POJO (of type `com.labproject.SkyTracker.OpenSky.Plane`) from non-Array representation (token: VALUE_STRING): type/property designed to be serialized as JSON Array
at [Source: (PushbackInputStream); line: 1, column: 31] (through reference chain: com.labproject.SkyTracker.OpenSky.SkyResponseObject["states"]->java.lang.Object[][0]->java.lang.Object[][0])
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:389)
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:342)
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:105)
... 5 more
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize a POJO (of type `com.labproject.SkyTracker.OpenSky.Plane`) from non-Array representation (token: VALUE_STRING): type/property designed to be serialized as JSON Array
at [Source: (PushbackInputStream); line: 1, column: 31] (through reference chain: com.labproject.SkyTracker.OpenSky.SkyResponseObject["states"]->java.lang.Object[][0]->java.lang.Object[][0])
at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)
at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1601)
at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1375)
at com.fasterxml.jackson.databind.deser.impl.BeanAsArrayDeserializer._deserializeFromNonArray(BeanAsArrayDeserializer.java:376)
at com.fasterxml.jackson.databind.deser.impl.BeanAsArrayDeserializer.deserialize(BeanAsArrayDeserializer.java:105)
at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:214)
at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:24)
at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:214)
at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:24)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:402)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:195)
at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:322)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4593)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3601)
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:378)
... 7 more
EDIT2: Forgot to put an example JSON:
{"time":1616687149,"states":[["4b1806","SWR141W ","Switzerland",1616687090,1616687145,8.5609,47.4424,null,true,0,244.69,null,null,null,null,false,0]]}