преобразование из строки в объект JSON Android

Я работаю над приложением для Android. В моем приложении мне нужно преобразовать строку в объект JSON, а затем проанализировать значения. Я проверил решение в Stackoverflow и нашел аналогичную проблему здесь ссылка

Решение такое

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

Я использую тот же способ в моем коде. Моя строка

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

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

И после замены я получил такой результат

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

когда я выполняю JSONObject jsonObj = new JSONObject(mybizData);

Я получаю следующее исключение JSON

org.json.JSONException: ожидаемое буквальное значение в символе 1 из

Пожалуйста, помогите мне решить мою проблему.


person sarath    schedule 12.08.2013    source источник
comment
Я предполагаю, что оскорбительный символ - это обратная косая черта из-за вашей замены. Почему именно вы это делаете? Откуда берется строка JSON?   -  person tiguchi    schedule 12.08.2013
comment
Я получаю строку из html.. не как json   -  person sarath    schedule 12.08.2013
comment
Просто удалите mystring= mystring.replace(\, \\\); и посмотреть, если это работает для вас тогда.   -  person tiguchi    schedule 12.08.2013


Ответы (9)


Удалите косые черты:

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 + "\"");
}
person Phil    schedule 12.08.2013
comment
что, если строка представляет собой массив объектов JSON? Нравится [{},{},{}] - person Francisco Corrales Morales; 18.06.2014
comment
@FranciscoCorralesMorales, вы можете использовать JSONArray obj = new JSONArray(json);. Затем вы можете использовать цикл for-loop для перебора массива. - person Phil; 18.06.2014
comment
хорошо, но что, если JSON может быть массивом или отдельным объектом? JSONArray не может этого сделать. - person Francisco Corrales Morales; 18.06.2014
comment
@FranciscoCorralesMorales просто использует блок try-catch. Если один терпит неудачу, примите другой. - person Phil; 18.06.2014
comment
@Phil Это не работает, если я изменяю json на Fat cat или любую другую простую строку, подобную этой. Что здесь происходит? Я просто перехожу к блоку catch. - person ; 27.05.2015
comment
@ripDaddy69 Похоже, это недопустимый JSON. Ожидается, что пары ключ-значение будут заключены в фигурные скобки. Попробуйте что-нибудь вроде {"Fat cat":"meow"}. - person Phil; 27.05.2015
comment
@Phil Это не похоже на допустимое назначение строки Java. Я не понимаю, что я делаю по-другому, хотя JSONObject obj = new JSONObject(Fat cat:meow); Я понял это, мне нужно было использовать \ перед кавычками, а затем настоящие кавычки вокруг всего этого. Спасибо. - person ; 27.05.2015
comment
Не работает для меня - person Kamal Oberoi; 07.07.2016
comment
@tobyyeats Можете ли вы привести пример того, как вы использовали \ и передавали {Fat cat:meow} в JSONObject? - person Neha; 11.07.2018
comment
я хочу преобразовать это {abc:10} и получить оба значения по отдельности. - person Arbaz.in; 19.03.2020

это работает

    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 + "\"");
    }
person Ercan ILIK    schedule 14.05.2016
comment
Хотя это действительно отвечает на вопрос, это не объясняет, почему и как это работает. Пожалуйста, добавьте такое объяснение. - person CerebralFart; 15.05.2016
comment
Это кажется простым кодовым решением, требующим создания еще одного объекта, который обрабатывает управляющую последовательность. - person kelalaka; 16.07.2020

попробуй это:

String json = "{'phonetype':'N95','cat':'WP'}";
person user3139217    schedule 13.03.2014
comment
что, если строка представляет собой массив объектов JSON? Нравится [{},{},{}] - person Francisco Corrales Morales; 18.06.2014
comment
Это хорошая идея. Одинарная кавычка работает и устраняет необходимость в escape-символах. - person david m lee; 15.08.2016
comment
Апостроф может работать в JAVA, но это не строгий законный JSON. Таким образом, вам может потребоваться сделать что-то по-другому в других языках или ситуациях. - person Jesse Chisholm; 07.09.2018

Вам просто нужны строки кода, как показано ниже:

   try {
        String myjsonString = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";
        JSONObject jsonObject = new JSONObject(myjsonString );
        //displaying the JSONObject as a String
        Log.d("JSONObject = ", jsonObject.toString());
        //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());
    }
person Benson    schedule 06.07.2018

просто попробуйте это, наконец, это работает для меня:

//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);
person mhKarami    schedule 21.01.2019

Чтобы получить JSONObject или JSONArray из строки, я создал этот класс:

public static class JSON {

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

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

Здесь, чтобы получить 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);
}

Пример:

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;
    }
}
person RiccardoCh    schedule 28.09.2016
comment
Вы можете просто проверить первый символ строки JSON, чтобы узнать, является ли он [ или {, чтобы узнать, является ли он массивом или объектом. Тогда вы не будете рисковать обоими исключениями, а только соответствующим. - person Jesse Chisholm; 07.09.2018

Использование Котлина

    val data = "{\"ApiInfo\":{\"description\":\"userDetails\",\"status\":\"success\"},\"userDetails\":{\"Name\":\"somename\",\"userName\":\"value\"},\"pendingPushDetails\":[]}\n"
    
try {
      val jsonObject = JSONObject(data)
      val infoObj = jsonObject.getJSONObject("ApiInfo")
    } catch (e: Exception) {
    }
person Thiago    schedule 20.02.2021

Вот код, и вы можете решить, какой
(синхронизированный) StringBuffer или более быстрый StringBuilder использовать.

Бенчмарк показывает, что StringBuilder работает быстрее.

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();
            }
        }
person android.dk    schedule 09.02.2015

Может быть ниже лучше.

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