Gegeben die folgende .json-Datei:
[
{
"name" : "New York",
"number" : "732921",
"center" : [
"latitude" : 38.895111,
"longitude" : -77.036667
]
},
{
"name" : "San Francisco",
"number" : "298732",
"center" : [
"latitude" : 37.783333,
"longitude" : -122.416667
]
}
]
Ich habe zwei Klassen vorbereitet, um die enthaltenen Daten darzustellen:
public class Location {
public String name;
public int number;
public GeoPoint center;
}
...
public class GeoPoint {
public double latitude;
public double longitude;
}
Um den Inhalt aus der .json-Datei zu analysieren, verwende ich Jackson 2.2.x und bereite die folgende Methode vor:
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;
}
Solange ich die center
Eigenschaft weglasse, können alle Inhalte analysiert werden. Wenn ich jedoch versuche, die Geokoordinaten zu analysieren, wird die folgende Fehlermeldung angezeigt:
com.fasterxml.jackson.databind.JsonMappingException: Instanz von
com.example.GeoPoint kann nicht aus dem START_ARRAY-Token unter [Quelle: android.content.res.AssetManager$AssetInputStream@416a5850; Zeile: 5, Spalte: 25]
(durch Referenzkette: com.example.Location ["center"])
center
ist ein Array ungültiger Objekte. Versuchen Sie zu ersetzen[
und]
mit{
und}
in dem JSON - String umlongitude
undlatitude
so werden sie Objekte sein.Antworten:
Ihre JSON-Zeichenfolge ist fehlerhaft: Der Typ von
center
ist ein Array ungültiger Objekte. Ersetzen Sie[
und]
mit{
und}
in der JSON-Zeichenfolgelongitude
undlatitude
so werden sie Objekte:quelle
JsonMappingException: out of START_ARRAY token
Die Ausnahme wird vom Jackson-Objekt-Mapper ausgelöst, da erObject {}
eineArray [{}]
Antwort erwartet, während er eine Antwort gefunden hat.Dies kann durch Ersetzen
Object
durchObject[]
im Argument für gelöst werdengeForObject("url",Object[].class)
. Verweise:quelle
Ich habe dieses Problem so sortiert, dass der JSON von JSONLint.com überprüft und dann korrigiert wurde. Und das ist Code für das gleiche.
Hinweis:
MyPojo[].class
Ist die Klasse mit Getter und Setter von JSON-Eigenschaften.Ergebnis:
quelle
Wie gesagt, der
JsonMappingException: out of START_ARRAY token
Jackson Object Mapper löst eine Ausnahme aus, da er eine erwartet,Object {}
während er eineArray [{}]
Antwort gefunden hat.Eine einfachere Lösung könnte darin bestehen, die Methode
getLocations
durch Folgendes zu ersetzen :Auf der anderen Seite, wenn Sie kein Pojo wie haben
Location
, könnten Sie verwenden:quelle
CollectionType
vs. Vor- oder Nachteile hatTypeReference
?TypeReference
Die Syntax ist viel kürzer als die andere. Ich bin mir nicht sicher, ob es in einigen Fällen eine Gegenanzeige im Zusammenhang mit der Löschung geben könnte ... aber in meiner WeltTypeReference
ist es einfach einfacher zu verwenden und zu verstehen.