conversion de chaîne en objet json android

107

Je travaille sur une application Android. Dans mon application, je dois convertir une chaîne en objet Json, puis analyser les valeurs. J'ai vérifié une solution dans stackoverflow et trouvé un problème similaire ici lien

La solution est comme ça

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

J'utilise la même manière dans mon code. Ma chaîne est

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

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

Et après le remplacement, j'ai eu le résultat comme ceci

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

quand j'exécute JSONObject jsonObj = new JSONObject(mybizData);

Je reçois l'exception json ci-dessous

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

Veuillez m'aider à résoudre mon problème.

sarath
la source
Je suppose que le caractère incriminé est une barre oblique inverse à cause de votre substitution. Pourquoi faites-vous exactement cela? D'où vient la chaîne JSON?
tiguchi
Je reçois la chaîne de html..pas en tant que json
sarath
1
Supprimez simplement mystring = mystring.replace ("\" "," \\\ ""); et voyez si cela fonctionne pour vous alors.
tiguchi

Réponses:

227

Supprimez les barres obliques:

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
la source
4
et si la chaîne est un tableau d'objets JSON? Comme "[{}, {}, {}]"
Francisco Corrales Morales
3
@FranciscoCorralesMorales que vous pouvez utiliser JSONArray obj = new JSONArray(json);. Ensuite, vous pouvez utiliser une boucle for pour parcourir le tableau.
Phil
2
@FranciscoCorralesMorales utilise simplement un bloc try-catch . Si l'un échoue, supposez l'autre.
Phil
1
@ ripDaddy69 Cela ressemble à un JSON invalide. Il attend des paires clé-valeur entourées d'accolades. Essayez quelque chose comme {"Fat cat":"meow"}.
Phil
2
@Phil Cela ne semble pas être une affectation de chaîne java valide. Je ne comprends pas ce que je fais différemment si JSONObject obj = new JSONObject ("Fat cat": "meow"); Je l'ai compris, j'avais besoin d'utiliser \ en face des guillemets, puis des citations réelles autour de tout. Merci.
31

c'est du travail

    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
la source
1
Bien que cela réponde à la question, cela n'explique pas pourquoi ni comment cela fonctionne. Veuillez ajouter une telle explication.
CerebralFart
Cela semble une solution de code simple, qui nécessite la création d'un autre objet qui gère la séquence d'échappement.
kelalaka le
7

essaye ça:

String json = "{'phonetype':'N95','cat':'WP'}";
user3139217
la source
2
et si la chaîne est un tableau d'objets JSON? Comme "[{}, {}, {}]"
Francisco Corrales Morales
C'est une bonne idée. Le guillemet simple fonctionne et élimine le besoin des caractères d'échappement.
david m lee
1
Apostrophe peut fonctionner, en JAVA, mais ce n'est pas un JSON légal strict . Vous devrez peut-être faire les choses différemment dans d'autres langues ou situations.
Jesse Chisholm
4

Pour obtenir un JSONObject ou JSONArray à partir d'une chaîne, j'ai créé cette classe:

public static class JSON {

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

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

Ici pour obtenir le 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);
}

Exemple:

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
la source
Vous pouvez simplement tester le premier caractère de la chaîne JSON pour voir si c'est le cas [ou {pour savoir s'il s'agit d'un tableau ou d'un objet. Alors vous ne risqueriez pas les deux exceptions, juste la plus pertinente.
Jesse Chisholm
3

essayez simplement ceci, enfin cela fonctionne pour moi:

//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
la source
3

Vous avez juste besoin des lignes de code comme ci-dessous:

 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
la source
0

Voici le code, et vous pouvez décider lequel
StringBuffer (synchronisé) ou le StringBuilder le plus rapide à utiliser.

Benchmark montre que StringBuilder est plus rapide.

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
la source
0

Peut-être en dessous, c'est mieux.

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
la source