konversi dari string ke objek json android

107

Saya sedang mengerjakan aplikasi Android. Di aplikasi saya, saya harus mengonversi string menjadi Json Object, lalu mengurai nilainya. Saya memeriksa solusi di stackoverflow dan menemukan masalah serupa di sini tautan

Solusinya seperti ini

       `{"phonetype":"N95","cat":"WP"}`
        JSONObject jsonObj = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");

Saya menggunakan cara yang sama dalam kode saya. String saya adalah

{"ApiInfo":{"description":"userDetails","status":"success"},"userDetails":{"Name":"somename","userName":"value"},"pendingPushDetails":[]}

string mystring= mystring.replace("\"", "\\\"");

Dan setelah ganti saya mendapat hasil seperti ini

{\"ApiInfo\":{\"description\":\"userDetails\",\"status\":\"success\"},\"userDetails\":{\"Name\":\"Sarath Babu\",\"userName\":\"sarath.babu.sarath babu\",\"Token\":\"ZIhvXsZlKCNL6Xj9OPIOOz3FlGta9g\",\"userId\":\"118\"},\"pendingPushDetails\":[]}

ketika saya mengeksekusi JSONObject jsonObj = new JSONObject(mybizData);

Saya mendapatkan pengecualian json di bawah ini

org.json.JSONException: Expected literal value at character 1 of

Tolong bantu saya untuk memecahkan masalah saya.

sarath
sumber
Saya kira karakter yang menyinggung adalah garis miring terbalik karena pergantian Anda. Sebenarnya kenapa kamu melakukan itu? Dari mana asal string JSON?
tiguchi
Saya mendapatkan string dari html..not sebagai json
sarath
1
Hapus saja mystring = mystring.replace ("\" "," \\\ ""); dan lihat apakah itu berhasil untuk Anda.
tiguchi

Jawaban:

227

Hapus garis miring:

String json = {"phonetype":"N95","cat":"WP"};

try {

    JSONObject obj = new JSONObject(json);

    Log.d("My App", obj.toString());

} catch (Throwable t) {
    Log.e("My App", "Could not parse malformed JSON: \"" + json + "\"");
}
Phil
sumber
4
bagaimana jika string adalah larik objek JSON? Seperti "[{}, {}, {}]"
Francisco Corrales Morales
3
@FranciscoCorralesMorales dapat Anda gunakan JSONArray obj = new JSONArray(json);. Kemudian Anda dapat menggunakan for-loop untuk melakukan iterasi melalui array.
Phil
2
@FranciscoCorralesMorales cukup gunakan blok coba-tangkap . Jika salah satu gagal, asumsikan yang lain.
Phil
1
@ ripDaddy69 Sepertinya itu JSON yang tidak valid. Ini mengharapkan pasangan nilai kunci yang dikelilingi oleh tanda kurung kurawal. Cobalah sesuatu seperti {"Fat cat":"meow"}.
Phil
2
@Phil Tampaknya bukan tugas String java yang valid. Saya tidak mengerti apa yang saya lakukan secara berbeda meskipun JSONObject obj = new JSONObject ("Fat cat": "meong"); Saya menemukan jawabannya, saya perlu menggunakan \ di depan kutipan, dan kemudian kutipan aktual di sekitar semuanya. Terima kasih.
31

kerjanya

    String json = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";

    try {

        JSONObject obj = new JSONObject(json);

        Log.d("My App", obj.toString());
        Log.d("phonetype value ", obj.getString("phonetype"));

    } catch (Throwable tx) {
        Log.e("My App", "Could not parse malformed JSON: \"" + json + "\"");
    }
Ercan ILIK
sumber
1
Meskipun ini menjawab pertanyaan, ini tidak menjelaskan mengapa atau bagaimana cara kerjanya. Tolong tambahkan penjelasan seperti itu.
CerebralFart
Tampaknya solusi kode sederhana, yang memerlukan pembuatan objek lain yang menangani urutan pelolosan.
kelalaka
7

coba ini:

String json = "{'phonetype':'N95','cat':'WP'}";
pengguna3139217
sumber
2
bagaimana jika string adalah larik objek JSON? Seperti "[{}, {}, {}]"
Francisco Corrales Morales
Ini ide yang bagus. Kutipan tunggal berfungsi dan menghilangkan kebutuhan akan karakter pelarian.
david m lee
1
Kemurtadan mungkin berhasil, di JAVA, tetapi ini bukanlah JSON legal yang ketat . Jadi, Anda mungkin perlu melakukan berbagai hal secara berbeda dalam bahasa atau situasi lain.
Jesse Chisholm
4

Untuk mendapatkan JSONObject atau JSONArray dari String, saya telah membuat kelas ini:

public static class JSON {

     public Object obj = null;
     public boolean isJsonArray = false;

     JSON(Object obj, boolean isJsonArray){
         this.obj = obj;
         this.isJsonArray = isJsonArray;
     }
}

Di sini untuk mendapatkan JSON:

public static JSON fromStringToJSON(String jsonString){

    boolean isJsonArray = false;
    Object obj = null;

    try {
        JSONArray jsonArray = new JSONArray(jsonString);
        Log.d("JSON", jsonArray.toString());
        obj = jsonArray;
        isJsonArray = true;
    }
    catch (Throwable t) {
        Log.e("JSON", "Malformed JSON: \"" + jsonString + "\"");
    }

    if (object == null) {
        try {
            JSONObject jsonObject = new JSONObject(jsonString);
            Log.d("JSON", jsonObject.toString());
            obj = jsonObject;
            isJsonArray = false;
        } catch (Throwable t) {
            Log.e("JSON", "Malformed JSON: \"" + jsonString + "\"");
        }
    }

    return new JSON(obj, isJsonArray);
}

Contoh:

JSON json = fromStringToJSON("{\"message\":\"ciao\"}");
if (json.obj != null) {

    // If the String is a JSON array
    if (json.isJsonArray) {
        JSONArray jsonArray = (JSONArray) json.obj;
    }
    // If it's a JSON object
    else {
        JSONObject jsonObject = (JSONObject) json.obj;
    }
}
RiccardoCh
sumber
Anda bisa menguji karakter pertama dari string JSON untuk melihat apakah itu [atau {untuk mengetahui apakah itu larik atau objek. Maka Anda tidak akan mempertaruhkan kedua pengecualian tersebut, hanya pengecualian yang terkait.
Jesse Chisholm
3

coba saja ini, akhirnya ini berhasil untuk saya:

//delete backslashes ( \ ) :
            data = data.replaceAll("[\\\\]{1}[\"]{1}","\"");
//delete first and last double quotation ( " ) :
            data = data.substring(data.indexOf("{"),data.lastIndexOf("}")+1);
            JSONObject json = new JSONObject(data);
mhKarami
sumber
3

Anda hanya membutuhkan baris kode seperti di bawah ini:

 try {
        String myjsonString = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";
        JSONObject jsonObject = new JSONObject(myjsonString );
        //getting specific key values
        Log.d("phonetype = ", jsonObject.getString("phonetype"));
        Log.d("cat = ", jsonObject.getString("cat");
    }catch (Exception ex) {
         StringWriter stringWriter = new StringWriter();
         ex.printStackTrace(new PrintWriter(stringWriter));
         Log.e("exception ::: ", stringwriter.toString());
    }
Ben
sumber
0

Ini kodenya, dan Anda bisa memutuskan yang mana
StringBuffer (tersinkronisasi) mana atau StringBuilder yang lebih cepat untuk digunakan.

Tolok ukur menunjukkan StringBuilder lebih cepat.

public class Main {
            int times = 777;
            long t;

            {
                StringBuffer sb = new StringBuffer();
                t = System.currentTimeMillis();
                for (int i = times; i --> 0 ;) {
                    sb.append("");
                    getJSONFromStringBuffer(String stringJSON);
                }
                System.out.println(System.currentTimeMillis() - t);
            }

            {
                StringBuilder sb = new StringBuilder();
                t = System.currentTimeMillis();
                for (int i = times; i --> 0 ;) {
                     getJSONFromStringBUilder(String stringJSON);
                    sb.append("");
                }
                System.out.println(System.currentTimeMillis() - t);
            }
            private String getJSONFromStringBUilder(String stringJSONArray) throws JSONException {
                return new StringBuffer(
                       new JSONArray(stringJSONArray).getJSONObject(0).getString("phonetype"))
                           .append(" ")
                           .append(
                       new JSONArray(employeeID).getJSONObject(0).getString("cat"))
                      .toString();
            }
            private String getJSONFromStringBuffer(String stringJSONArray) throws JSONException {
                return new StringBuffer(
                       new JSONArray(stringJSONArray).getJSONObject(0).getString("phonetype"))
                           .append(" ")
                           .append(
                       new JSONArray(employeeID).getJSONObject(0).getString("cat"))
                      .toString();
            }
        }
android.dk
sumber
0

Mungkin di bawah lebih baik.

JSONObject jsonObject=null;
    try {
        jsonObject=new JSONObject();
        jsonObject.put("phonetype","N95");
        jsonObject.put("cat","wp");
        String jsonStr=jsonObject.toString();
    } catch (JSONException e) {
        e.printStackTrace();
    }
shaojun lyu
sumber