简体   繁体   English

Jackson/RestTemplate Springboot 反序列化 arrays JSON 数组

[英]Jackson/RestTemplate Springboot to deserialize an array of arrays JSON

I seem to be quite stuck on how to desearilize an arrays of arrays.我似乎很纠结如何对 arrays 的 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'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对象)和那些 arrays 带有字符串和整数。

I have this class:我有这个 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使用 getter 和 setter

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:但是 jackson 似乎正在抛出错误,已经尝试了多种组合但无法使其正常工作,我们将不胜感激:

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: EDIT2:忘了举一个例子JSON:

{"time":1616687149,"states":[["4b1806","SWR141W ","Switzerland",1616687090,1616687145,8.5609,47.4424,null,true,0,244.69,null,null,null,null,false,0]]}

Add this in ur pom.xml将此添加到您的 pom.xml

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM