dizeden json nesnesine android dönüştürme


107

Bir Android uygulaması üzerinde çalışıyorum. Uygulamamda bir dizeyi Json Nesnesine dönüştürmem ve ardından değerleri ayrıştırmam gerekiyor. Stackoverflow'da bir çözüm aradım ve burada benzer bir sorun buldum bağlantı

Çözüm böyle

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

Kodumda da aynı şekilde kullanıyorum. Benim dizim

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

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

Ve değiştirdikten sonra sonucu şu şekilde aldım

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

yürüttüğümde JSONObject jsonObj = new JSONObject(mybizData);

Aşağıdaki json istisnasını alıyorum

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

Lütfen sorunumu çözmeme yardım edin.


Sanırım rahatsız edici karakter, değiştirdiğinizden dolayı ters eğik çizgi. Bunu tam olarak neden yapıyorsun? JSON dizesi nereden geliyor?
tiguchi

Dizeyi html'den alıyorum.. not json
sarath

1
Sadece mystring = mystring.replace ("\" "," \\\ ""); ve o zaman sizin için işe yarayıp yaramadığını görün.
tiguchi

Yanıtlar:


227

Eğik çizgileri kaldırın:

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 + "\"");
}

4
ya dize bir JSON nesneleri dizisiyse? "[{}, {}, {}]" Gibi
Francisco Corrales Morales

3
@FranciscoCorralesMorales kullanabilirsiniz JSONArray obj = new JSONArray(json);. Ardından , dizi boyunca yineleme yapmak için bir for döngüsü kullanabilirsiniz.
Phil

2
@FranciscoCorralesMorales sadece bir dene-yakala bloğu kullanıyor. Biri başarısız olursa, diğerini üstlenin.
Phil

1
@ ripDaddy69 Bu geçersiz JSON gibi görünüyor. Küme parantezleri ile çevrili anahtar-değer eşleşmeleri bekler. Gibi bir şey dene {"Fat cat":"meow"}.
Phil

2
@Phil Bu geçerli bir java String ataması gibi görünmüyor. JSONObject obj = new JSONObject ("Fat cat": "meow") olsa da, neyi farklı yaptığımı anlamıyorum; Bunu anladım, alıntıların önünde \ kullanmam gerekiyordu ve sonra her şeyin etrafında gerçek alıntılar yapmam gerekiyordu. Teşekkürler.

31

Çalışıyor

    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 + "\"");
    }

1
Bu soruyu cevaplarken, neden veya nasıl çalıştığını açıklamıyor. Lütfen böyle bir açıklama ekleyin.
CerebralFart

Kaçış sırasını işleyen başka bir nesne oluşturmayı gerektiren basit bir kod çözümü gibi görünüyor.
kelalaka

7

bunu dene:

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

2
ya dize bir JSON nesneleri dizisiyse? "[{}, {}, {}]" Gibi
Francisco Corrales Morales

Bu iyi bir fikir. Tek alıntı işe yarar ve kaçış karakterlerine olan ihtiyacı ortadan kaldırır.
david m lee

1
Kesme işareti JAVA'da işe yarayabilir, ancak katı yasal JSON değildir . Bu yüzden başka dillerde veya durumlarda farklı şeyler yapmanız gerekebilir.
Jesse Chisholm

4

Bir String'den JSONObject veya JSONArray almak için bu sınıfı oluşturdum:

public static class JSON {

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

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

JSON'u almak için:

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);
}

Misal:

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;
    }
}

JSON dizesinin ilk karakterini, olup olmadığını görmek [veya {bir dizi veya nesne olup olmadığını anlamak için test edebilirsiniz . O zaman her iki istisnayı da riske atmazsınız, sadece ilgili olanı.
Jesse Chisholm

3

sadece şunu dene, sonunda bu benim için çalışıyor:

//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);

3

Aşağıdaki kod satırlarına ihtiyacınız var:

 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());
    }

0

İşte kod ve hangi
(senkronize) StringBuffer veya daha hızlı StringBuilder'ı kullanacağınıza karar verebilirsiniz .

Kıyaslama, StringBuilder'ın Daha Hızlı olduğunu gösteriyor.

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();
            }
        }

0

Altında olabilir daha iyi.

JSONObject jsonObject=null;
    try {
        jsonObject=new JSONObject();
        jsonObject.put("phonetype","N95");
        jsonObject.put("cat","wp");
        String jsonStr=jsonObject.toString();
    } catch (JSONException e) {
        e.printStackTrace();
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.