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 centerpropiedad, 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"])

centeres una matriz de objetos no válidos. Intente reemplazar[y]con{y}en la cadena JSON alrededorlongitudeylatitudeasí serán objetos.Respuestas:
Su cadena JSON está mal formada: el tipo de
centeres una matriz de objetos no válidos. Reemplace[y]con{y}en la cadena JSON alrededorlongitudeylatitudeasí serán objetos:fuente
JsonMappingException: out of START_ARRAY tokenLa 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
ObjectconObject[]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[].classes la clase que tiene getter y setter de propiedades json.Resultado:
fuente
Como se dijo,
JsonMappingException: out of START_ARRAY tokenel 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
getLocationscon:Por otro lado, si no tienes un pojo como
Location, podrías usar:fuente
CollectionTypevs.TypeReference?TypeReferencela 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 mundoTypeReferencees más fácil de usar y comprender.