Saya perlu mengonversi string JSON tertentu ke objek Java. Saya menggunakan Jackson untuk penanganan JSON. Saya tidak memiliki kendali atas input JSON (saya baca dari layanan web). Ini adalah input JSON saya:
{"wrapper":[{"id":"13","name":"Fred"}]}
Berikut ini adalah kasus penggunaan yang disederhanakan:
private void tryReading() {
String jsonStr = "{\"wrapper\"\:[{\"id\":\"13\",\"name\":\"Fred\"}]}";
ObjectMapper mapper = new ObjectMapper();
Wrapper wrapper = null;
try {
wrapper = mapper.readValue(jsonStr , Wrapper.class);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("wrapper = " + wrapper);
}
Kelas entitas saya adalah:
public Class Student {
private String name;
private String id;
//getters & setters for name & id here
}
Kelas Wrapper saya pada dasarnya adalah objek wadah untuk mendapatkan daftar siswa saya:
public Class Wrapper {
private List<Student> students;
//getters & setters here
}
Saya terus mendapatkan kesalahan ini dan "bungkus" kembali null
. Saya tidak yakin apa yang hilang. Bisakah seseorang membantu?
org.codehaus.jackson.map.exc.UnrecognizedPropertyException:
Unrecognized field "wrapper" (Class Wrapper), not marked as ignorable
at [Source: java.io.StringReader@1198891; line: 1, column: 13]
(through reference chain: Wrapper["wrapper"])
at org.codehaus.jackson.map.exc.UnrecognizedPropertyException
.from(UnrecognizedPropertyException.java:53)
java
json
data-binding
jackson
jshree
sumber
sumber
Map dummy<String,Student> = myClientResponse.getEntity(new GenericType<Map<String, Student>>(){});
dan kemudianStudent myStudent = dummy.get("wrapper");
Jawaban:
Anda dapat menggunakan anotasi tingkat kelas Jackson:
Ini akan mengabaikan setiap properti yang belum Anda tetapkan dalam POJO Anda. Sangat berguna ketika Anda hanya mencari beberapa properti di JSON dan tidak ingin menulis seluruh pemetaan. Info lebih lanjut di situs web Jackson . Jika Anda ingin mengabaikan properti yang tidak dinyatakan, Anda harus menulis:
sumber
(ignoreUnknown = true)
ketika membubuhi keterangan kelas Anda jika tidak maka tidak akan berhasilKamu bisa menggunakan
Ini akan mengabaikan semua properti yang tidak dideklarasikan.
sumber
Jawaban pertama hampir benar, tetapi yang diperlukan adalah mengubah metode pengambil, BUKAN bidang - bidang bersifat pribadi (dan tidak terdeteksi secara otomatis); lebih lanjut, getter memiliki prioritas di atas bidang jika keduanya terlihat. (Ada cara untuk membuat bidang pribadi terlihat juga, tetapi jika Anda ingin memiliki pengambil tidak ada gunanya)
Jadi rajin pengambil harus diberi nama
getWrapper()
, atau dijelaskan dengan:Jika Anda lebih suka nama metode pengambil seperti apa adanya.
sumber
@JsonProperty
. Meskipun@JsonGetter
alias legal, ini jarang digunakan sebagai@JsonProperty
karya untuk getter, setter, dan bidang; setter dan getter dapat dibedakan dengan tanda tangan (satu tidak mengambil argumen, mengembalikan tidak kosong; lainnya mengambil satu argumen).menggunakan Jackson 2.6.0, ini bekerja untuk saya:
dan dengan pengaturan:
sumber
ObjectMapper
, untuk mengaturFAIL_ON_UNKNOWN_PROPERTIES
properti secara global.dapat dicapai 2 cara:
Tandai POJO untuk mengabaikan properti yang tidak dikenal
Mengkonfigurasi ObjectMapper yang membuat cerita bersambung / De-cerita bersambung POJO / json seperti di bawah ini:
sumber
Ini hanya bekerja untuk saya
@JsonIgnoreProperties(ignoreUnknown = true)
penjelasan tidak.sumber
Wrapper
contoh di mana daftar siswanull
atau kosong.Ini berfungsi lebih baik daripada Semua, harap merujuk ke properti ini.
sumber
Jika Anda menggunakan Jackson 2.0
sumber
Menurut dokumen Anda dapat mengabaikan bidang yang dipilih atau semua bidang yang terkenal:
sumber
Ini bekerja untuk saya dengan kode berikut:
sumber
Menambahkan setter dan getter memecahkan masalah , yang saya rasakan adalah masalah sebenarnya adalah bagaimana menyelesaikannya tetapi tidak bagaimana menekan / mengabaikan kesalahan. Saya mendapat kesalahan " Bidang tidak dikenal .. tidak ditandai sebagai dapat diabaikan .. "
Meskipun saya menggunakan penjelasan di bawah ini di atas kelas itu tidak dapat mengurai objek json dan memberi saya masukan
Kemudian saya menyadari bahwa saya tidak menambahkan setter dan getter, setelah menambahkan setter dan getter ke "Wrapper" dan ke "Student" itu bekerja seperti pesona.
sumber
Jackson mengeluh karena tidak dapat menemukan bidang di pembungkus kelas Anda yang disebut "pembungkus". Ini melakukan ini karena objek JSON Anda memiliki properti yang disebut "wrapper".
Saya pikir perbaikannya adalah mengubah nama bidang kelas Wrapper Anda menjadi "wrapper", bukan "siswa".
sumber
Saya telah mencoba metode di bawah ini dan berfungsi untuk pembacaan format JSON dengan Jackson. Gunakan solusi yang sudah disarankan dari: pengambil anotasi dengan
@JsonProperty("wrapper")
Kelas pembungkus Anda
Saran saya untuk kelas pembungkus
Namun ini akan memberi Anda output format:
Juga untuk informasi lebih lanjut, lihat https://github.com/FasterXML/jackson-annotations
Semoga ini membantu
sumber
{}
simbol di bilah alat untuk memformat cuplikan kode Anda.Solusi ini bersifat umum ketika membaca aliran json dan hanya perlu mendapatkan beberapa bidang sementara bidang yang tidak dipetakan dengan benar di Kelas Domain Anda dapat diabaikan:
Solusi terperinci adalah menggunakan alat seperti jsonschema2pojo untuk autogenerasi Kelas Domain yang diperlukan seperti Siswa dari Skema Respons json. Anda dapat melakukan yang terakhir dengan pengonversi skema json ke online.
sumber
Beri catatan pada siswa bidang seperti di bawah ini karena ada ketidakcocokan dalam nama properti json dan properti java
sumber
Seperti tidak ada orang lain yang disebutkan, saya pikir ...
Masalahnya adalah properti Anda di JSON Anda disebut "pembungkus" dan properti Anda di Wrapper.class disebut "siswa".
Jadi ...
sumber
setel publik bidang kelas Anda bukan pribadi .
sumber
Apa yang berhasil bagi saya, adalah menjadikan properti itu milik umum. Itu memecahkan masalah bagi saya.
sumber
Entah Ubah
untuk
---- atau ----
Ubah string JSON Anda menjadi
sumber
Masukan Anda
menunjukkan bahwa itu adalah Obyek, dengan bidang bernama "pembungkus", yang merupakan Koleksi Siswa. Jadi rekomendasi saya adalah,
dimana
Wrapper
didefinisikan sebagaisumber
Firebase Android baru memperkenalkan beberapa perubahan besar; di bawah salinan dokumen:
[ https://firebase.google.com/support/guides/firebase-android] :
Perbarui objek model Java Anda
Seperti dengan 2.x SDK, Firebase Database akan secara otomatis mengonversi objek Java yang Anda akses
DatabaseReference.setValue()
ke JSON dan dapat membaca JSON menjadi objek Java menggunakanDataSnapshot.getValue()
.Di SDK baru, ketika membaca JSON menjadi objek Java dengan
DataSnapshot.getValue()
, properti yang tidak dikenal di JSON sekarang diabaikan secara default sehingga Anda tidak lagi membutuhkannya@JsonIgnoreExtraProperties(ignoreUnknown=true)
.Untuk mengecualikan bidang / getter saat menulis objek Java ke JSON, anotasi sekarang disebut
@Exclude
bukan@JsonIgnore
.Jika ada properti tambahan di JSON Anda yang tidak ada di kelas Java Anda, Anda akan melihat peringatan ini di file log:
Anda dapat menyingkirkan peringatan ini dengan meletakkan
@IgnoreExtraProperties
anotasi di kelas Anda. Jika Anda ingin Firebase Database berperilaku seperti yang terjadi pada 2.x SDK dan melemparkan pengecualian jika ada properti yang tidak dikenal, Anda bisa meletakkan@ThrowOnExtraProperties
anotasi di kelas Anda.sumber
Bagi saya, satu-satunya jalur
@JsonIgnoreProperties(ignoreUnknown = true)
tidak bekerja juga.
Cukup tambahkan
Jackson 2.4.0
sumber
Ini bekerja dengan baik untuk saya
sumber
Saya memperbaiki masalah ini dengan hanya mengubah tanda tangan setter dan metode pengambil kelas POJO saya. Yang harus saya lakukan adalah mengubah metode getObject agar sesuai dengan apa yang dicari oleh mapper. Dalam kasus saya, saya memiliki getImageUrl awalnya, tetapi data JSON memiliki image_url yang melemparkan mapper off. Saya mengubah setter dan getter saya menjadi getImage_url dan setImage_url .
Semoga ini membantu.
sumber
POJO harus didefinisikan sebagai
Kelas respons
Kelas pembungkus
dan mapper untuk membaca nilai
sumber
wrappers
, tapiwrapper
.Ini mungkin respons yang sangat terlambat, tetapi hanya mengubah POJO untuk ini akan menyelesaikan string json yang disediakan dalam masalah (karena, string input tidak dalam kendali Anda seperti yang Anda katakan):
sumber
Satu kemungkinan lain adalah properti ini di properti application.prop
spring.jackson.deserialization.fail-on-unknown-properties=false
, yang tidak memerlukan perubahan kode lain dalam aplikasi Anda. Dan ketika Anda yakin kontraknya stabil, Anda dapat menghapus properti ini atau menandainya benar.sumber
Ini mungkin bukan masalah yang sama dengan yang dimiliki OP tetapi jika seseorang datang ke sini dengan kesalahan yang sama yang saya miliki maka ini akan membantu mereka memecahkan masalah mereka. Saya mendapatkan kesalahan yang sama dengan OP ketika saya menggunakan ObjectMapper dari ketergantungan yang berbeda dengan anotasi JsonProperty.
Ini bekerja:
Tidak bekerja:
sumber
Google membawa saya ke sini dan saya terkejut melihat jawabannya ... semua menyarankan melewati kesalahan ( yang selalu menggigit 4 kali lipat kemudian dalam pengembangan ) daripada menyelesaikannya sampai pria ini dipulihkan oleh iman dalam SO!
digunakan untuk mengonversi String json ke objek kelas, yang hilang adalah bahwa
TargetClass
harus memilikiget
ter publikset
. Sama juga tidak ada dalam cuplikan pertanyaan OP! :)via lombok kelas Anda seperti di bawah ini seharusnya berfungsi !!
sumber
impor com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@JsonIgnoreProperties
sumber