Reputation: 344
Normally I'd do fine with an object inside array with
models = mapper.readValue(jSONstream, mapper.getTypeFactory()
.constructCollectionType(List.class, Model.class));
But this HTTP request send back at me something like this.
Route.JSON
[
[
{
"length":1278.455,
"duration":660,
"legs":[
{
"length":342,
"duration":286.92,
"type":"walk",
"locs":[
{
"coord":{
"x":2548196,
"y":6678528
},
"arrTime":"201510271103",
"depTime":"201510271103",
"name":null
},
{
"coord":{
"x":2548221.7,
"y":6678553.5
},
"arrTime":"201510271103",
"depTime":"201510271103",
"name":"Purotie"
},
{
"coord":{
"x":2548380.4,
"y":6678731.4
},
"arrTime":"201510271107",
"depTime":"201510271107",
"name":null
},
{
"coord":{
"x":2548393.8,
"y":6678721.2
},
"arrTime":"201510271107",
"depTime":"201510271107",
"name":"Pit\u00e4j\u00e4nm\u00e4entie"
},
{
"coord":{
"x":2548426,
"y":6678692
},
"arrTime":"201510271108",
"depTime":"201510271108",
"name":"Takomotie",
"code":"1465104",
"shortCode":"1518",
"stopAddress":"Pit\u00e4j\u00e4nm\u00e4entie"
}
]
},
{
"length":456,
"duration":60,
"type":"5",
"code":"2550 2",
"locs":[
{
"coord":{
"x":2548426,
"y":6678692
},
"arrTime":"201510271108",
"depTime":"201510271108",
"name":"Takomotie",
"code":"1465104",
"shortCode":"1518",
"stopAddress":"Pit\u00e4j\u00e4nm\u00e4entie"
},
{
"coord":{
"x":2548768,
"y":6678460
},
"arrTime":"201510271109",
"depTime":"201510271109",
"name":"Valimotie",
"code":"1465102",
"shortCode":"1516",
"stopAddress":"Pit\u00e4j\u00e4nm\u00e4entie"
}
]
},
{
"length":479,
"duration":366.36,
"type":"walk",
"locs":[
{
"coord":{
"x":2548768,
"y":6678460
},
"arrTime":"201510271109",
"depTime":"201510271109",
"name":"Valimotie",
"code":"1465102",
"shortCode":"1516",
"stopAddress":"Pit\u00e4j\u00e4nm\u00e4entie"
},
{
"coord":{
"x":2548818.8,
"y":6678448
},
"arrTime":"201510271109",
"depTime":"201510271109",
"name":null
},
{
"coord":{
"x":2548822.7,
"y":6678455.2
},
"arrTime":"201510271110",
"depTime":"201510271110",
"name":"Pit\u00e4j\u00e4nm\u00e4entie"
},
{
"coord":{
"x":2548838.4,
"y":6678446.2
},
"arrTime":"201510271110",
"depTime":"201510271110",
"name":"H\u00f6yl\u00e4\u00e4m\u00f6tie"
},
{
"coord":{
"x":2548945.8,
"y":6678631.6
},
"arrTime":"201510271113",
"depTime":"201510271113",
"name":"Karvaamokuja"
},
{
"coord":{
"x":2549062,
"y":6678638
},
"arrTime":"201510271115",
"depTime":"201510271115",
"name":null
}
]
}
]
}
],
[
{
"length":1278.455,
"duration":660,
"legs":[
{
"length":342,
"duration":286.92,
"type":"walk",
"locs":[
{
"coord":{
"x":2548196,
"y":6678528
},
"arrTime":"201510271104",
"depTime":"201510271104",
"name":null
},
{
"coord":{
"x":2548221.7,
"y":6678553.5
},
"arrTime":"201510271104",
"depTime":"201510271104",
"name":"Purotie"
},
{
"coord":{
"x":2548380.4,
"y":6678731.4
},
"arrTime":"201510271108",
"depTime":"201510271108",
"name":null
},
{
"coord":{
"x":2548393.8,
"y":6678721.2
},
"arrTime":"201510271108",
"depTime":"201510271108",
"name":"Pit\u00e4j\u00e4nm\u00e4entie"
},
{
"coord":{
"x":2548426,
"y":6678692
},
"arrTime":"201510271109",
"depTime":"201510271109",
"name":"Takomotie",
"code":"1465104",
"shortCode":"1518",
"stopAddress":"Pit\u00e4j\u00e4nm\u00e4entie"
}
]
},
{
"length":456,
"duration":60,
"type":"5",
"code":"2270 2",
"locs":[
{
"coord":{
"x":2548426,
"y":6678692
},
"arrTime":"201510271109",
"depTime":"201510271109",
"name":"Takomotie",
"code":"1465104",
"shortCode":"1518",
"stopAddress":"Pit\u00e4j\u00e4nm\u00e4entie"
},
{
"coord":{
"x":2548768,
"y":6678460
},
"arrTime":"201510271110",
"depTime":"201510271110",
"name":"Valimotie",
"code":"1465102",
"shortCode":"1516",
"stopAddress":"Pit\u00e4j\u00e4nm\u00e4entie"
}
]
},
{
"length":479,
"duration":366.36,
"type":"walk",
"locs":[
{
"coord":{
"x":2548768,
"y":6678460
},
"arrTime":"201510271110",
"depTime":"201510271110",
"name":"Valimotie",
"code":"1465102",
"shortCode":"1516",
"stopAddress":"Pit\u00e4j\u00e4nm\u00e4entie"
},
{
"coord":{
"x":2548818.8,
"y":6678448
},
"arrTime":"201510271110",
"depTime":"201510271110",
"name":null
},
{
"coord":{
"x":2548822.7,
"y":6678455.2
},
"arrTime":"201510271111",
"depTime":"201510271111",
"name":"Pit\u00e4j\u00e4nm\u00e4entie"
},
{
"coord":{
"x":2548838.4,
"y":6678446.2
},
"arrTime":"201510271111",
"depTime":"201510271111",
"name":"H\u00f6yl\u00e4\u00e4m\u00f6tie"
},
{
"coord":{
"x":2548945.8,
"y":6678631.6
},
"arrTime":"201510271114",
"depTime":"201510271114",
"name":"Karvaamokuja"
},
{
"coord":{
"x":2549062,
"y":6678638
},
"arrTime":"201510271116",
"depTime":"201510271116",
"name":null
}
]
}
]
}
],
[
{
"length":1198.389,
"duration":960,
"legs":[
{
"length":1198,
"duration":998.34,
"type":"walk",
"locs":[
{
"coord":{
"x":2548196,
"y":6678528
},
"arrTime":"201510271105",
"depTime":"201510271105",
"name":null
},
{
"coord":{
"x":2548221.7,
"y":6678553.5
},
"arrTime":"201510271105",
"depTime":"201510271105",
"name":"Purotie - Takomotie"
},
{
"coord":{
"x":2548426,
"y":6678797.7
},
"arrTime":"201510271110",
"depTime":"201510271110",
"name":"Takomotie"
},
{
"coord":{
"x":2548455.9,
"y":6678803.9
},
"arrTime":"201510271110",
"depTime":"201510271110",
"name":"Kornetintie"
},
{
"coord":{
"x":2548760.5,
"y":6678595
},
"arrTime":"201510271116",
"depTime":"201510271116",
"name":"Valimotie"
},
{
"coord":{
"x":2548824.5,
"y":6678701.7
},
"arrTime":"201510271117",
"depTime":"201510271117",
"name":"Karvaamokuja"
},
{
"coord":{
"x":2549062,
"y":6678638
},
"arrTime":"201510271121",
"depTime":"201510271121",
"name":null
}
]
}
]
}
]
]
which is an array inside an array. I have no idea how to parse it correctly, and I have tried a lot of different way to do it. Any help appreciated.
P/S: Here is the model with all getter and setter.
Model.class
public class ModelRoutes {
List<ModelRoute> modelRoutes;
public class ModelRoute {
long lenght;
long duration;
List<Leg> legs;
public class Leg {
long lenght;
long duration;
String type;
String code;
List<Locs> locs;
List<Shape> shapes;
public class Locs {
Coord coord;
long arrTime;
long depTime;
String name;
long code;
String shortCode;
String stopAddress;
public class Coord {
double x;
double y;
}
}
public class Shape{
double x;
double y;
}
}
}
}
Also, running a Unit Test on this give me the error com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of com.avior.aviorandroid.Models.ModelRoutes out of START_ARRAY token at line: 1, column: 2
Upvotes: 0
Views: 944
Reputation: 1680
You need one more clases to map object between ModelRoute
and Leg
.
Look at that picture of your json:
JSON ->List< ModelRoute< NEW_Object< Leg ...
Upvotes: 1
Reputation: 3019
DeanK
I would define my model classes as shown below and use composition to construct the outer most element.
public class OuterMostClass {
private double length;
private int duration,
private InnerElement[] innerElements;
}
public class InnerElement {
private double length;
private double duration;
private String type;
private Location[] locs;
}
public class Location {
private Coordinates coords;
private Date arrTime;
private Date depTime;
private String name;
}
public class Coordinates {
private int x;
private int y;
}
Please add necessary getters and setters(using any IDE feature) and also correct some of the names, The result of the Http request is the Array of OuterMostClass. So you will get an array of OuterMostClass[].
Upvotes: 0