Saya memiliki metode ini:
public static Object parseStringToObject(String json) {
String Object = json;
Gson gson = new Gson();
Object objects = gson.fromJson(object, Object.class);
parseConfigFromObjectToString(object);
return objects;
}
Dan saya ingin mengurai JSON dengan:
public static void addObject(String IP, Object addObject) {
try {
String json = sendPostRequest("http://" + IP + ":3000/config/add_Object", ConfigJSONParser.parseConfigFromObjectToString(addObject));
addObject = ConfigJSONParser.parseStringToObject(json);
} catch (Exception ex) {
ex.printStackTrace();
}
}
Tapi saya mendapatkan pesan kesalahan:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Diharapkan BEGIN_OBJECT tetapi STRING pada baris 1 kolom 1
Jawaban:
Bahkan tanpa melihat string JSON Anda, Anda dapat mengetahui dari pesan kesalahan bahwa itu bukan struktur yang benar untuk diurai menjadi instance kelas Anda.
Gson mengharapkan string JSON Anda dimulai dengan kurung kurawal buka objek. misalnya
Tapi string yang Anda berikan padanya dimulai dengan tanda kutip terbuka
sumber
parseStringToObject
menyarankan bahwa ia mengharapkan objek JSON, yang selalu dimulai dengan{
.{"ip":"192.167.1.15"}
dariRestful EJB web service with jboss EAP 7.1
di backend. Namun saya mendapatkan "Diharapkan BEGIN_OBJECT tetapi STRING di baris 1 kolom 1" Tolong bantu saya ... Ini adalah layanan web saya: @Stateless @Path ("/ getflashcard") kelas publik GetFlashcard {@Interceptors (Validator.class) @GET @Produces (MediaType.APPLICATION_JSON) public String getFlashcard () {String jsonString = new JSONObject (). Put ("ip", "192.167.1.15"). ToString (); return jsonString; }}JSON yang tidak valid dari server harus selalu menjadi kasus penggunaan yang diharapkan. Sejuta hal bisa salah selama transmisi. Gson agak rumit, karena keluaran kesalahannya akan memberi Anda satu masalah, dan pengecualian sebenarnya yang Anda tangkap akan dari jenis yang berbeda.
Dengan semua itu, perbaikan yang tepat di sisi klien adalah
Jika Anda ingin tahu mengapa JSON yang Anda terima dari server salah, Anda dapat melihat ke dalam blok catch Anda di pengecualian. Tetapi meskipun itu masalah Anda, itu bukan tanggung jawab klien untuk memperbaiki JSON yang diterimanya dari internet.
Either way, itu adalah tanggung jawab klien untuk memutuskan apa yang harus dilakukan ketika mendapat JSON buruk. Dua kemungkinan adalah menolak JSON dan tidak melakukan apa pun, dan mencoba lagi.
Jika Anda akan mencoba lagi, saya sangat menyarankan untuk mengatur bendera di dalam blok coba / tangkap dan kemudian menanggapi bendera itu di luar blok coba / tangkap. Percobaan / tangkap bersarang kemungkinan besar adalah bagaimana Gson membawa kita ke dalam kekacauan ini dengan pelacakan tumpukan dan pengecualian yang tidak cocok.
Dengan kata lain, meskipun saya akui tidak terlihat elegan, saya akan merekomendasikan
sumber
Di Retrofit2, Ketika Anda ingin mengirim parameter Anda dalam bentuk mentah, Anda harus menggunakan Scalars.
pertama tambahkan ini di gradle Anda:
SampleActivity saya:
Referensi: [ Bagaimana cara POST seluruh JSON mentah dalam isi permintaan Retrofit?
sumber
Mungkin Anda
JSON Object
benar, tetapi respons yang Anda terima bukanlah data Anda yang valid. Sama seperti ketika Anda menghubungkan yang tidak validWiFi
, Anda mungkin menerima respons aneh< html>.....< /html>
yangGSON
tidak dapat diurai.Anda mungkin perlu melakukan beberapa
try..catch..
respon aneh ini untuk menghindari crash.sumber
Saya datang untuk berbagi solusi. Kesalahan terjadi pada saya setelah memaksa notbook untuk menutup telepon. solusi yang mungkin
clean preject
.sumber
Pastikan Anda memiliki objek DESERIALISASI seperti DATE / DATETIME dll. Jika Anda langsung mengirim JSON tanpa deserialisasi maka hal ini dapat menyebabkan masalah ini.
sumber
Dalam situasi saya, saya memiliki "model", terdiri dari beberapa parameter String, dengan pengecualian satu: itu adalah array byte
byte[]
. Beberapa cuplikan kode:Baris terakhir di atas adalah saat
dipicu. Mencari melalui SO, saya menyadari bahwa saya perlu memiliki beberapa bentuk
Adapter
untuk mengubah sayaBaseModel
ke sana kemari menjadi JsonObject. Memiliki campuranString
danbyte[]
dalam model memang memperumit. Rupanya,Gson
tidak terlalu suka situasinya.Saya akhirnya membuat
Adapter
untuk memastikanbyte[]
diubah keBase64
format. IniAdapter
kelas saya :Untuk mengonversi JSONObject menjadi model, saya menggunakan yang berikut ini:
Demikian pula, untuk mengonversi model ke JSONObject, saya menggunakan yang berikut ini:
Apa yang kode lakukan pada dasarnya adalah untuk mendorong yang dimaksudkan
class/object
(dalam hal ini,byte[]
kelas) melaluiAdapter
setiap kali ditemui selama konversi ke / dari JSONObject.sumber
Jangan gunakan
jsonObject.toString
pada objek JSON.sumber
Dalam kasus saya, saya Mengembalikan Objek JSON sebagai
Diselesaikan dengan mengubahnya sebagai
Di sini data adalah sub JsonObject dan harus dimulai dari {bukan ""
sumber
jika format dan variabel json Anda baik-baik saja, periksa kueri database Anda ... bahkan jika data disimpan dalam db dengan benar, masalah sebenarnya mungkin ada di sana ... periksa kembali kueri Anda dan coba lagi .. Semoga membantu
sumber
Jangan lupa untuk mengonversi objek Anda menjadi Json terlebih dahulu menggunakan Gson ()
Kemudian Anda dapat dengan mudah mengubahnya kembali menjadi objek menggunakan pustaka yang mengagumkan ini
sumber
Saya punya kasus di mana saya membaca dari file json tulisan tangan. Json itu sempurna. Namun, kesalahan ini terjadi. Jadi saya menulis dari objek java ke file json, lalu membaca dari file json itu. semuanya baik-baik saja. Saya tidak bisa melihat perbedaan antara json tulisan tangan dan yang dari objek java. Mencoba BeyondCompare tidak melihat perbedaan. Saya akhirnya memperhatikan dua ukuran file yang sedikit berbeda, dan saya menggunakan alat winHex dan mendeteksi hal-hal tambahan. Jadi solusi untuk situasi saya adalah, buat salinan file json yang bagus, tempelkan konten ke dalamnya dan gunakan.
sumber