从字符串到json对象的转换android


107

我正在开发一个Android应用程序。在我的应用程序中,我必须将字符串转换为Json Object,然后解析值。我检查了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: Expected literal value at character 1 of

请帮助我解决我的问题。


我猜因为您的替换,令人反感的字符是反斜杠。你到底为什么要这么做?JSON字符串从何而来?
tiguchi

我从html..not作为json获取字符串
sarath

1
只需删除mystring = mystring.replace(“ \”“,” \\\“”); 然后查看它是否对您有用。
tiguchi 2013年

Answers:


227

删除斜杠:

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
如果字符串是JSON对象数组怎么办?像“ [[{},{},{}]”一样
Francisco Corrales Morales 2014年

3
您可以使用@FranciscoCorralesMorales JSONArray obj = new JSONArray(json);。然后,您可以使用for循环遍历数组。
2014年

2
@FranciscoCorralesMorales仅使用try-catch块。如果一个失败,则假设另一个失败。
菲尔(Phil)

1
@ ripDaddy69听起来像是无效的JSON。它期望键值对被大括号包围。尝试类似的东西{"Fat cat":"meow"}
2015年

2
@Phil看来不是有效的java String赋值。我不理解我在做什么,尽管JSONObject obj = new JSONObject(“ Fat cat”:“ meow”); 我弄清楚了,我需要在引号前使用\,然后在整个内容中使用实际引号。谢谢。

31

是工作

    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
尽管这确实回答了问题,但并未解释其原因或工作方式。请添加这样的说明。
CerebralFart

似乎是一个简单的代码解决方案,它需要创建另一个处理转义序列的对象。
kelalaka

7

试试这个:

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

2
如果字符串是JSON对象数组怎么办?像“ [[},{},{}]”一样
Francisco Corrales Morales 2014年

这是一个好主意。单引号有效,并且不需要转义符。
大卫·李

1
在Java中,撇号可能有效,但这不是严格的合法JSON。因此,您可能需要在其他语言或情况下做不同的事情。
杰西·奇斯霍尔姆

4

要从字符串获取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;
    }
}

您可以仅测试JSON字符串的第一个字符以查看它是否为字符串,[或者{知道它是数组还是对象。这样一来,您就不必冒着两个例外的风险,而只是冒险。
杰西·奇斯霍尔姆

3

尝试一下,最后对我有用:

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

您只需要下面的代码行:

 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

这是代码,您可以决定使用哪个
(同步的)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();
            }
        }

0

可能在下面比较好。

JSONObject jsonObject=null;
    try {
        jsonObject=new JSONObject();
        jsonObject.put("phonetype","N95");
        jsonObject.put("cat","wp");
        String jsonStr=jsonObject.toString();
    } catch (JSONException e) {
        e.printStackTrace();
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.