Biorąc pod uwagę następujący plik .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
]
}
]
Przygotowałem dwie klasy reprezentujące zawarte dane:
public class Location {
public String name;
public int number;
public GeoPoint center;
}
...
public class GeoPoint {
public double latitude;
public double longitude;
}
Do parsowania treści z pliku .json używam Jacksona 2.2.x i przygotowałem następującą metodę:
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;
}
Dopóki pominę tę center
właściwość, cała zawartość może zostać przeanalizowana. Jednak gdy próbuję przeanalizować współrzędne geograficzne, pojawia się następujący komunikat o błędzie:
com.fasterxml.jackson.databind.JsonMappingException: nie można deserializować instancji
com.example.GeoPoint z START_ARRAY tokenu pod adresem [Źródło: android.content.res.AssetManager$AssetInputStream@416a5850; wiersz: 5, kolumna: 25]
(przez łańcuch odwołań: com.example.Location ["centrum"])
center
to tablica nieprawidłowych obiektów. Spróbuj zamienić[
a]
z{
a}
w ciągu JSON wokółlongitude
ilatitude
tak będą obiekty.Odpowiedzi:
Twój ciąg JSON jest źle sformułowany: typ
center
to tablica nieprawidłowych obiektów. Wymień[
i]
z{
i}
w ciągu około JSONlongitude
ilatitude
tak będą obiekty:źródło
JsonMappingException: out of START_ARRAY token
Wyjątek jest generowany przez program mapowania obiektów Jacksona, ponieważ oczekuje an,Object {}
podczas gdy znalazłArray [{}]
w odpowiedzi.Problem ten można rozwiązać poprzez wymianę
Object
zObject[]
w argumentugeForObject("url",Object[].class)
. Bibliografia:źródło
Rozwiązałem ten problem jako weryfikację json z JSONLint.com, a następnie poprawienie go. A to jest kod na to samo.
Uwaga:
MyPojo[].class
jest to klasa mająca getter i setter właściwości json.Wynik:
źródło
Jak już powiedziano, program
JsonMappingException: out of START_ARRAY token
mapowania obiektów Jacksona zgłasza wyjątek , ponieważ oczekuje,Object {}
żeArray [{}]
w odpowiedzi znalazł a .Prostszym rozwiązaniem mogłoby być zastąpienie metody
getLocations
:Z drugiej strony, jeśli nie masz typu pojo
Location
, możesz użyć:źródło
CollectionType
vs.TypeReference
?TypeReference
składnia jest znacznie krótsza niż inne. Nie jestem pewien, czy w niektórych przypadkach może istnieć przeciwwskazanie związane z usunięciem typu ... ale w moim świecieTypeReference
jest po prostu łatwiejszy w użyciu i zrozumieniu.