Diberikan file .json berikut:
[
{
"name" : "New York",
"number" : "732921",
"center" : [
"latitude" : 38.895111,
"longitude" : -77.036667
]
},
{
"name" : "San Francisco",
"number" : "298732",
"center" : [
"latitude" : 37.783333,
"longitude" : -122.416667
]
}
]
Saya menyiapkan dua kelas untuk mewakili data yang terkandung:
public class Location {
public String name;
public int number;
public GeoPoint center;
}
...
public class GeoPoint {
public double latitude;
public double longitude;
}
Untuk mengurai konten dari file .json saya menggunakan Jackson 2.2.x dan menyiapkan metode berikut:
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;
}
Selama saya meninggalkan center
properti, semua konten dapat diurai. Namun, ketika saya mencoba mengurai geo-koordinat saya berakhir dengan pesan kesalahan berikut:
com.fasterxml.jackson.databind.JsonMappingException: Tidak dapat menghapus nama instance
com.example.GeoPoint dari token START_ARRAY di [Sumber: android.content.res.AssetManager$AssetInputStream@416a5850; baris: 5, kolom: 25]
(melalui rantai referensi: com.example.Location ["center"])
center
adalah larik objek yang tidak valid. Coba ganti[
dan]
dengan{
dan}
dalam string JSON sekitarlongitude
danlatitude
sehingga mereka akan benda-benda.Jawaban:
String JSON Anda salah format: jenisnya
center
adalah larik objek yang tidak valid. Ganti[
dan]
dengan{
dan}
dalam string JSON sekitarlongitude
danlatitude
sehingga mereka akan menjadi objek:sumber
JsonMappingException: out of START_ARRAY token
pengecualian dilemparkan oleh mapper objek Jackson karena ia mengharapkanObject {}
sedangkan ia menemukan sebagaiArray [{}]
tanggapan.Ini dapat diselesaikan dengan mengganti
Object
denganObject[]
dalam argumen untukgeForObject("url",Object[].class)
. Referensi:sumber
Saya mengurutkan masalah ini sebagai memverifikasi json dari JSONLint.com dan kemudian, memperbaikinya. Dan ini adalah kode yang sama.
Catatan:
MyPojo[].class
adalah kelas yang memiliki properti getter dan setter json.Hasil:
sumber
Seperti yang dikatakan,
JsonMappingException: out of START_ARRAY token
pengecualian dilemparkan oleh pemeta objek Jackson karena mengharapkanObject {}
sementara itu menemukanArray [{}]
tanggapan.Solusi yang lebih sederhana dapat mengganti metode
getLocations
dengan:Di sisi lain, jika Anda tidak menyukai pojo
Location
, Anda dapat menggunakan:sumber
CollectionType
vs.TypeReference
?TypeReference
sintaks jauh lebih pendek dari yang lain. Tidak yakin, jika dalam beberapa kasus mungkin ada indikasi balasan terkait dengan jenis penghapusan ... tetapi di dunia sayaTypeReference
lebih mudah digunakan dan dipahami.