【问题标题】:conversion from string to JSON object Android从字符串转换为 JSON 对象 Android
【发布时间】:2013-08-14 02:42:32
【问题描述】:

我正在开发一个 Android 应用程序。在我的应用程序中,我必须将字符串转换为 JSON 对象,然后解析值。我在 Stackoverflow 中检查了一个解决方案,并在这里找到了类似的问题 link

解决办法是这样的

       `{"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 处的预期文字值

请帮我解决我的问题。

【问题讨论】:

  • 我猜有问题的字符是反斜杠,因为你的替换。你到底为什么要这么做? JSON 字符串从何而来?
  • 我从 html..not as json 获取字符串
  • 只需删除 mystring= mystring.replace("\"", "\\\"");看看它是否适合你。

标签: android json string-conversion jsonexception


【解决方案1】:

删除斜线:​​

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

【讨论】:

  • 如果字符串是 JSON 对象数组怎么办?像“[{},{},{}]”
  • @FranciscoCorralesMorales 你可以使用JSONArray obj = new JSONArray(json);。然后你可以使用 for-loop 来遍历数组。
  • @FranciscoCorralesMorales 只需使用 try-catch 块。如果其中一个失败,则假设另一个。
  • @ripDaddy69 这听起来像是无效的 JSON。它需要用大括号括起来的键值对。试试{"Fat cat":"meow"}
  • @Phil 这似乎不是有效的 java 字符串分配。尽管 JSONObject obj = new JSONObject("Fat cat":"meow"); 我不明白我在做什么不同我想通了,我需要在引号前面使用 \,然后在整个内容周围使用实际引号。谢谢。
【解决方案2】:

它的工作

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

【讨论】:

  • 虽然这确实回答了这个问题,但它并没有解释它为什么或如何工作。请添加这样的解释。
  • 这似乎是一个简单的代码解决方案,需要创建另一个处理转义序列的对象。
【解决方案3】:

试试这个:

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

【讨论】:

  • 如果字符串是 JSON 对象数组怎么办?像“[{},{},{}]”
  • 这是个好主意。单引号有效,它消除了对转义字符的需要。
  • 撇号在 JAVA 中可能有效,但它不是 严格 合法的 JSON。所以你可能需要在其他语言或情况下做不同的事情。
【解决方案4】:

您只需要如下代码行:

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

【讨论】:

    【解决方案5】:

    试试这个, 最后这对我有用:

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

    【讨论】:

      【解决方案6】:

      为了从字符串中获取 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 字符串的第一个字符,看看它是 [ 还是 { 来知道它是一个数组还是一个对象。那么你就不会冒这两个例外的风险,而只是一个相关的例外。
      【解决方案7】:

      使用 Kotlin

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

      【讨论】:

        【解决方案8】:

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

        【讨论】:

          【解决方案9】:

          可能下面会更好。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-05-03
            • 2020-05-04
            • 1970-01-01
            • 2019-08-27
            • 2020-05-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多