【问题标题】:JSONObject.put string method adding extra \ character to JSON StringJSONObject.put 字符串方法将额外的 \ 字符添加到 JSON 字符串
【发布时间】:2014-05-29 09:39:38
【问题描述】:

我有一个 json 字符串,其中包含 pid、name、price 作为元素。我在 logcat 中显示它。但是当我使用 put 方法将 json 字符串添加到 json 对象时,这个字符串会发生变化。当我打印 json 对象 '\' 字符被添加到每个键值对。我无法弄清楚问题的真正原因。

json 是纯字符串,jObj 是 JSONObject。

我的 logcat 详细信息是:

json = {"products":[{"pid":"14","name":"zxc","price":"123456"},{"pid":"6","name":"Sony Xperia","price":"35000"},{"pid":"8","name":"Samsung Galaxy Note","price":"32000"},{"pid":"5","name":"htc","price":"26326"},{"pid":"9","name":"Nokia Lumia 800","price":"18000"},{"pid":"2","name":"iphone","price":"12345"},{"pid":"15","name":"sdjnas","price":"12243"},{"pid":"13","name":"Samsung S5222","price":"6500"},{"pid":"11","name":"Nokia C201","price":"4400"},{"pid":"7","name":"Nokia Asha 200","price":"4000"},{"pid":"1","name":"htc","price":"1234"},{"pid":"3","name":"htc","price":"1234"},{"pid":"4","name":"htc","price":"1234"},{"pid":"10","name":"aks","price":"1234"},{"pid":"12","name":"asd","price":"123"}],"success":1}

写完下面这行代码后:

jObj.put("details", json);

添加了一个额外的字符“\”。

json object = {"details":"{\"products\":[{\"pid\":\"14\",\"name\":\"zxc\",\"price\":\"123456\"},{\"pid\":\"6\",\"name\":\"Sony Xperia\",\"price\":\"35000\"},{\"pid\":\"8\",\"name\":\"Samsung Galaxy Note\",\"price\":\"32000\"},{\"pid\":\"5\",\"name\":\"htc\",\"price\":\"26326\"},{\"pid\":\"9\",\"name\":\"Nokia Lumia 800\",\"price\":\"18000\"},{\"pid\":\"2\",\"name\":\"iphone\",\"price\":\"12345\"},{\"pid\":\"15\",\"name\":\"sdjnas\",\"price\":\"12243\"},{\"pid\":\"13\",\"name\":\"Samsung S5222\",\"price\":\"6500\"},{\"pid\":\"11\",\"name\":\"Nokia C201\",\"price\":\"4400\"},{\"pid\":\"7\",\"name\":\"Nokia Asha 200\",\"price\":\"4000\"},{\"pid\":\"1\",\"name\":\"htc\",\"price\":\"1234\"},{\"pid\":\"3\",\"name\":\"htc\",\"price\":\"1234\"},{\"pid\":\"4\",\"name\":\"htc\",\"price\":\"1234\"},{\"pid\":\"10\",\"name\":\"aks\",\"price\":\"1234\"},{\"pid\":\"12\",\"name\":\"asd\",\"price\":\"123\"}],\"success\":1}\n"}

添加反斜杠会导致获取字符串时出现问题。 JSONException 没有成功的值显示在 logcat 中:

JSONObject json = null;

List<NameValuePair> params = new ArrayList<NameValuePair>();
        JSONObject json = jParser.makeHttpRequest(url_all_products, "GET", params);

        Log.d("All Products: ", json.toString());

        try
        {
            int success = json.getInt("success");

            if (success == 1)
            {
                products = json.getJSONArray(TAG_PRODUCTS);

                for (int i = 0; i < products.length(); i++)
                {
                    JSONObject c = products.getJSONObject(i);

                    String id = c.getString(TAG_PID);
                    String name = c.getString(TAG_NAME);

                    HashMap<String, String> map = new HashMap<String, String>();

                    map.put(TAG_PID, id);
                    map.put(TAG_NAME, name);

                    productsList.add(map);
                }
            }
            else
            {
                Intent i = new Intent(getApplicationContext(), NewProductActivity.class);
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(i);
            }
        }
        catch (JSONException e)
        {
            e.printStackTrace();
        }

logcat 是:

05-29 15:54:21.772: W/ThrottleService(91): unable to find stats for iface rmnet0
05-29 15:54:26.192: I/ActivityManager(91): START {cmp=com.example.androidhive/.AllProductsActivity} from pid 588
05-29 15:54:26.192: W/WindowManager(91): Failure taking screenshot for (180x300) to layer 21010
05-29 15:54:26.502: I/WindowManager(91): createSurface Window{415a5d70 com.example.androidhive/com.example.androidhive.AllProductsActivity paused=false}: DRAW NOW PENDING
05-29 15:54:26.543: I/WindowManager(91): createSurface Window{415b8c88     com.example.androidhive/com.example.androidhive.AllProductsActivity paused=false}: DRAW NOW     PENDING
05-29 15:54:27.002: I/ARMAssembler(35): generated scanline__00000077:03010104_00008001_00000000 [ 89 ipp] (110 ins) at [0x41e00670:0x41e00828] in 1129891 ns
05-29 15:54:27.202: I/ActivityManager(91): Displayed com.example.androidhive/.AllProductsActivity: +980ms
05-29 15:54:27.472: D/dalvikvm(588): GC_CONCURRENT freed 125K, 3% free 10212K/10439K, paused 5ms+4ms
05-29 15:54:27.853: I/JSONPArser.java(588): json = {"products":    [{"pid":"14","name":"zxc","price":"123456"},{"pid":"6","name":"Sony Xperia","price":"35000"},{"pid":"8","name":"Samsung Galaxy Note","price":"32000"},{"pid":"5","name":"htc","price":"26326"},{"pid":"9","name":"Nokia Lumia 800","price":"18000"},{"pid":"2","name":"iphone","price":"12345"},{"pid":"15","name":"sdjnas","price":"12243"},{"pid":"13","name":"Samsung S5222","price":"6500"},{"pid":"11","name":"Nokia C201","price":"4400"},{"pid":"7","name":"Nokia Asha 200","price":"4000"},{"pid":"1","name":"htc","price":"1234"},{"pid":"3","name":"htc","price":"1234"},{"pid":"4","name":"htc","price":"1234"},{"pid":"10","name":"aks","price":"1234"},{"pid":"12","name":"asd","price":"123"}],"success":1}
05-29 15:54:27.892: I/JSONPArser.java(588): json object = {"details":"{\"products\":[{\"pid\":\"14\",\"name\":\"zxc\",\"price\":\"123456\"},{\"pid\":\"6\",\"name\":\"Sony Xperia\",\"price\":\"35000\"},{\"pid\":\"8\",\"name\":\"Samsung Galaxy Note\",\"price\":\"32000\"},{\"pid\":\"5\",\"name\":\"htc\",\"price\":\"26326\"},{\"pid\":\"9\",\"name\":\"Nokia Lumia 800\",\"price\":\"18000\"},{\"pid\":\"2\",\"name\":\"iphone\",\"price\":\"12345\"},{\"pid\":\"15\",\"name\":\"sdjnas\",\"price\":\"12243\"},{\"pid\":\"13\",\"name\":\"Samsung S5222\",\"price\":\"6500\"},{\"pid\":\"11\",\"name\":\"Nokia C201\",\"price\":\"4400\"},{\"pid\":\"7\",\"name\":\"Nokia Asha 200\",\"price\":\"4000\"},{\"pid\":\"1\",\"name\":\"htc\",\"price\":\"1234\"},{\"pid\":\"3\",\"name\":\"htc\",\"price\":\"1234\"},{\"pid\":\"4\",\"name\":\"htc\",\"price\":\"1234\"},{\"pid\":\"10\",\"name\":\"aks\",\"price\":\"1234\"},{\"pid\":\"12\",\"name\":\"asd\",\"price\":\"123\"}],\"success\":1}\n"}
05-29 15:54:27.892: I/JSONPArser.java(588): Line 27
05-29 15:54:27.902: I/JSONPArser.java(588): Line 30
05-29 15:54:27.902: D/All Products:(588): {"details":"{\"products\":[{\"pid\":\"14\",\"name\":\"zxc\",\"price\":\"123456\"},{\"pid\":\"6\",\"name\":\"Sony Xperia\",\"price\":\"35000\"},{\"pid\":\"8\",\"name\":\"Samsung Galaxy Note\",\"price\":\"32000\"},{\"pid\":\"5\",\"name\":\"htc\",\"price\":\"26326\"},{\"pid\":\"9\",\"name\":\"Nokia Lumia 800\",\"price\":\"18000\"},{\"pid\":\"2\",\"name\":\"iphone\",\"price\":\"12345\"},{\"pid\":\"15\",\"name\":\"sdjnas\",\"price\":\"12243\"},{\"pid\":\"13\",\"name\":\"Samsung S5222\",\"price\":\"6500\"},{\"pid\":\"11\",\"name\":\"Nokia C201\",\"price\":\"4400\"},{\"pid\":\"7\",\"name\":\"Nokia Asha 200\",\"price\":\"4000\"},{\"pid\":\"1\",\"name\":\"htc\",\"price\":\"1234\"},{\"pid\":\"3\",\"name\":\"htc\",\"price\":\"1234\"},{\"pid\":\"4\",\"name\":\"htc\",\"price\":\"1234\"},{\"pid\":\"10\",\"name\":\"aks\",\"price\":\"1234\"},{\"pid\":\"12\",\"name\":\"asd\",\"price\":\"123\"}],\"success\":1}\n"}
05-29 15:54:27.933: W/System.err(588): org.json.JSONException: No value for success
05-29 15:54:27.933: W/System.err(588):  at org.json.JSONObject.get(JSONObject.java:354)
05-29 15:54:27.933: W/System.err(588):  at org.json.JSONObject.getInt(JSONObject.java:443)
05-29 15:54:27.942: W/System.err(588):  at com.example.androidhive.AllProductsActivity$LoadAllProducts.doInBackground(AllProductsActivity.java:110)
05-29 15:54:27.942: W/System.err(588):  at com.example.androidhive.AllProductsActivity$LoadAllProducts.doInBackground(AllProductsActivity.java:1)
05-29 15:54:27.973: W/System.err(588):  at android.os.AsyncTask$2.call(AsyncTask.java:264)
05-29 15:54:27.973: W/System.err(588):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
05-29 15:54:27.973: W/System.err(588):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
05-29 15:54:27.973: W/System.err(588):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
05-29 15:54:27.973: W/System.err(588):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
05-29 15:54:27.982: W/System.err(588):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
05-29 15:54:27.982: W/System.err(588):  at java.lang.Thread.run(Thread.java:856)

【问题讨论】:

  • “详细信息”不会转换为“详细信息”吗?
  • @Sufian 不,不是。我这里直接粘贴了jObj的值。
  • 提示:字符转义:en.wikipedia.org/wiki/Escape_character
  • @MarcinOrlowski 你到底想指出什么?
  • @AkshaySoam 斜线是escape characters

标签: android json


【解决方案1】:
JSONObject jsonObj = new JSONObject(json);

jsonObj.get("products");

JSONObject newJsonObj = new JSONObject();
newJsonObj.put("whatever", jsonObj.get("products"));

如果您想保留 json 而不转义,则需要将 jsonObject 添加到 JsonArray。

JSONArray jsonArray = new JSONArray();
jsonArray.put(jsonObj);

稍后再取回

for (int i = 0; i < jsonArray.length(); i++)  { 
    JSONObject jsonObj = jsonArray.getJSONObject(i); 
 // then you can start filtering out the array.
    if (jsonObj.has("products")) {
         JSONArray nJsonArray = new JSONArray(jsonObj.get("products"));
          for (......) {} 
}

【讨论】:

  • @AkshaySoam 你替换了jParser.makeHttpRequest() 行吗?我很好奇jParser 的类型。请说明。
  • @Sufian 实际上我在另一个 android 活动中接收到 json 对象。我只是在第一个活动中声明时将 json 字符串作为参数传递,然后尝试获得“成功”并且它起作用了...... :)
  • @AkshaySoam 没有理解您的意思,但您已经解决了这个问题,这很好。 :)
【解决方案2】:

这是一个功能强大的良好 JSON 对象。我用 Cocoa JSON 编辑器创建了一个,没有错误。我不知道它添加了那些反斜杠,但我可以告诉你没关系

【讨论】:

  • 但我在获取值时遇到问题。例如,编译器说“成功”没有价值,但您可以看到它出现在字符串的最后,但带有一个额外的斜杠。所以我在从中检索字符串时遇到问题。
  • @AkshaySoam 请在您访问“成功”的地方发布代码。
猜你喜欢
  • 2016-11-09
  • 1970-01-01
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多