Dado el siguiente archivo .json:
[
{
"name" : "New York",
"number" : "732921",
"center" : [
"latitude" : 38.895111,
"longitude" : -77.036667
]
},
{
"name" : "San Francisco",
"number" : "298732",
"center" : [
"latitude" : 37.783333,
"longitude" : -122.416667
]
}
]
Preparé dos clases para representar los datos contenidos:
public class Location {
public String name;
public int number;
public GeoPoint center;
}
...
public class GeoPoint {
public double latitude;
public double longitude;
}
Para analizar el contenido del archivo .json, utilizo Jackson 2.2.xy preparé el siguiente método:
public static List<Location> getLocations(InputStream inputStream) {
ObjectMapper objectMapper = new ObjectMapper();
try {
TypeFactory typeFactory = objectMapper.getTypeFactory();
CollectionType collectionType = typeFactory.constructCollectionType(
List.class, Location.class);
return objectMapper.readValue(inputStream, collectionType);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
Siempre que omita la center
propiedad, se puede analizar todo el contenido. Sin embargo, cuando trato de analizar las coordenadas geográficas, termino con el siguiente mensaje de error:
com.fasterxml.jackson.databind.JsonMappingException: no se puede deserializar la instancia de
com.example.GeoPoint fuera del token START_ARRAY en [Fuente: android.content.res.AssetManager$AssetInputStream@416a5850; línea: 5, columna: 25]
(a través de la cadena de referencia: com.example.Location ["center"])
center
es una matriz de objetos no válidos. Intente reemplazar[
y]
con{
y}
en la cadena JSON alrededorlongitude
ylatitude
así serán objetos.Respuestas:
Su cadena JSON está mal formada: el tipo de
center
es una matriz de objetos no válidos. Reemplace[
y]
con{
y}
en la cadena JSON alrededorlongitude
ylatitude
así serán objetos:fuente
JsonMappingException: out of START_ARRAY token
La excepción es lanzada por el mapeador de objetos de Jackson, ya que espera unObject {}
mientras que encontró unaArray [{}]
en respuesta.Esto se puede resolver reemplazando
Object
conObject[]
en el argumento degeForObject("url",Object[].class)
. Referencias:fuente
Resolví este problema para verificar el json de JSONLint.com y luego corregirlo. Y este es un código para lo mismo.
Nota:
MyPojo[].class
es la clase que tiene getter y setter de propiedades json.Resultado:
fuente
Como se dijo,
JsonMappingException: out of START_ARRAY token
el mapeador de objetos de Jackson lanza una excepción , ya que espera unObject {}
mientras que encontró unaArray [{}]
respuesta.Una solución más simple podría reemplazar el método
getLocations
con:Por otro lado, si no tienes un pojo como
Location
, podrías usar:fuente
CollectionType
vs.TypeReference
?TypeReference
la sintaxis es mucho más corta que la otra. No estoy seguro, si en algunos casos podría haber una contraindicación relacionada con el borrado de tipo ... pero en mi mundoTypeReference
es más fácil de usar y comprender.