conversão de string para objeto json android

107

Estou trabalhando em um aplicativo Android. Em meu aplicativo, preciso converter uma string em objeto Json e, em seguida, analisar os valores. Eu verifiquei uma solução em stackoverflow e encontrei um problema semelhante aqui link

A solução é assim

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

Eu uso da mesma forma no meu código. Minha corda é

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

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

E depois de substituir eu obtive o resultado como este

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

quando eu executo JSONObject jsonObj = new JSONObject(mybizData);

Estou recebendo a exceção json abaixo

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

Por favor me ajude a resolver meu problema.

Sarath
fonte
Eu acho que o personagem ofensivo é uma barra invertida por causa da sua substituição. Por que exatamente você está fazendo isso? De onde vem a string JSON?
tiguchi
Estou recebendo a string de html .. não como json
sarath
1
Apenas remova mystring = mystring.replace ("\" "," \\\ ""); e veja se funciona para você.
tiguchi

Respostas:

227

Remova as barras:

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
fonte
4
e se a string for uma matriz de objetos JSON? Como "[{}, {}, {}]"
Francisco Corrales Morales
3
@FranciscoCorralesMorales você pode usar JSONArray obj = new JSONArray(json);. Em seguida, você pode usar um loop for para iterar pelo array.
Phil
2
@FranciscoCorralesMorales use apenas um bloco try-catch . Se um falhar, assuma o outro.
Phil
1
@ ripDaddy69 Parece que é JSON inválido. Ele espera pares de valores-chave entre chaves. Experimente algo como {"Fat cat":"meow"}.
Phil
2
@Phil Isso não parece ser uma atribuição de string java válida. Não entendo o que estou fazendo de forma diferente embora JSONObject obj = new JSONObject ("Gato gordo": "miau"); Eu descobri, eu precisava usar \ na frente das citações e, em seguida, citações reais em torno da coisa toda. Obrigado.
31

isso funciona

    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
fonte
1
Embora isso responda à pergunta, não explica por que ou como funciona. Por favor, adicione essa explicação.
CerebralFart
Parece uma solução de código simples, que requer a criação de outro objeto que manipule a sequência de escape.
kelalaka
7

tente isto:

String json = "{'phonetype':'N95','cat':'WP'}";
user3139217
fonte
2
e se a string for uma matriz de objetos JSON? Como "[{}, {}, {}]"
Francisco Corrales Morales de
Essa é uma boa ideia. A aspa simples funciona e elimina a necessidade de caracteres de escape.
David M Lee
1
A apóstrofe pode funcionar, em JAVA, mas não é um JSON estritamente legal. Portanto, você pode precisar fazer as coisas de maneira diferente em outras línguas ou situações.
Jesse Chisholm
4

Para obter um JSONObject ou JSONArray de uma String, criei esta classe:

public static class JSON {

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

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

Aqui para obter o 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);
}

Exemplo:

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
fonte
Você poderia apenas testar o primeiro caractere da string JSON para ver se é [ou {para saber se é uma matriz ou um objeto. Então você não estaria arriscando as duas exceções, apenas a pertinente.
Jesse Chisholm
3

tente isso, finalmente isso funciona para mim:

//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
fonte
3

Você só precisa das linhas de código abaixo:

 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
fonte
0

Aqui está o código e você pode decidir qual
StringBuffer (sincronizado) ou StringBuilder mais rápido usar.

O benchmark mostra que StringBuilder é mais rápido.

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
fonte
0

Pode estar abaixo é melhor.

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
fonte