无法完成Java String转换为JSON

时间:2013-03-18 10:25:01

标签: java android json

我有从服务器获得的JSON:

 "[{\"id\":\"1\",\"name\":\"Milos\",\"city\":\"Smederevo\",\"email\":\"milos\",\"password\":\"\"},
 {\"id\":\"3\",\"name\":\"Boban\",\"city\":\"Beograd\",\"email\":\"bole\",\"password\":\"\"},
 {\"id\":\"4\",\"name\":\"Pele\",\"city\":\"Brazil\",\"email\":\"pele@pele.com\",\"password\":\"\"},
 {\"id\":\"5\",\"name\":\"admin\",\"city\":\"Smederevo\",\"email\":\"admin\",\"password\":\"\"}]"

我正在使用json并发送到我的线程(android线程):

  try {
            // Method from which I am getting Json described above
            String s = dm.getAllUsers();

            /*JSONParser jp = new JSONParser();             
            JsonElement jelement = new JsonParser().parse(s);   
                JsonArray array1 = jelement.getAsJsonArray();*/

            JSONArray array = new JSONArray(s);
            for (int i = 0; i < array.length(); i++) {

                 JSONObject menuObject = array.getJSONObject(i);

                 // doing something with the object
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

我根本无法处理那个Json。 我收到错误“java.lang.String无法转换为JSONArray”。 知道问题是由“\”引起的,我只是不知道如何摆脱“\”。

我试过了:

1) s.replace("\\", "");
2) s.replace("\"", "'");
3) s.replaceAll("\\", "");
4) s.replaceAll("\"", "'");

为了擦除“\”,但替换根本不作出反应。 我也尝试用“google-gson-2.2.2”库解决问题(上面评论下的代码,在方法下)。

请问任何建议?

7 个答案:

答案 0 :(得分:4)

尝试此解决方案。

s.replaceAll("\\\\", "");

这肯定会奏效。

答案 1 :(得分:4)

问题已经解决:

 1) s = s.trim();
 2) s = s.substring(1, s.length()-1);
 3) s = s.replace("\\", "");

我的json已经在开头和结尾用“双引号”检索。我不知道字符串变量如何不能弄清楚“双引号”是用于“开头”和“结束”字符串。

谢谢大家的帮助。

答案 2 :(得分:4)

这对我有用......

在你的json中,&#34;你的Json&#34;被包含在&#34;&#34;所以它被认为是一个不是数组的字符串..

所以解决方案是两件事之一:

如果您可以修改服务器响应,请删除&#34;&#34;来自json数组的arround。或首先将其解析为字符串,然后从该字符串创建一个json数组,如..

String notes = jobj.getString("GetNotesResult");
jarray = new JSONArray(notes);

答案 3 :(得分:2)

只有在中间删除反斜杠()时,json才有效。你可以使用类似的东西: strJson = strJson.replaceAll("\\\\", "");strJson = strJson.replace("\\", "");删除json String之间的斜杠()。请注意,replaceAll()方法将第一个参数视为正则表达式,因此必须双重转义反斜杠,但replace()方法将其视为文字字符串,因此您只需将其转义一次。请查看下面的示例以便更好地理解:我已将您的json文本保存在我的硬盘驱动器中名为json.txt的文件中以进行演示。文件中的内容如下所示:

[{\"id\":\"1\",\"name\":\"Milos\",\"city\":\"Smederevo\",\"email\":\"milos\",\"password\":\"\"},
 {\"id\":\"3\",\"name\":\"Boban\",\"city\":\"Beograd\",\"email\":\"bole\",\"password\":\"\"},
 {\"id\":\"4\",\"name\":\"Pele\",\"city\":\"Brazil\",\"email\":\"pele@pele.com\",\"password\":\"\"},
 {\"id\":\"5\",\"name\":\"admin\",\"city\":\"Smederevo\",\"email\":\"admin\",\"password\":\"\"}]

现在获取json数组的代码:

package com.stackoverflow.com;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;


public class JsonTest {

    public static void main(String[] args) {    

        try {
            FileReader fileReader = new FileReader("C:/Users/sarath_sivan/Desktop/json.txt");
            BufferedReader br = new BufferedReader(fileReader); 
            StringBuilder strJsonBuilder = new StringBuilder();
            String strLine; 

            while((strLine = br.readLine()) != null) { 
                strJsonBuilder.append(strLine);
            }

            String strJson = strJsonBuilder.toString();
            strJson = strJson.replaceAll("\\\\", ""); /*OR you can use strJson = strJson.replace("\\", "");*/
            JSONArray jsonArray = new JSONArray(strJson);

            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject menuObject = jsonArray.getJSONObject(i);
                System.out.println("id: " + menuObject.getInt("id"));
                System.out.println("name: " + menuObject.getString("name"));
                System.out.println("city: " + menuObject.getString("city"));
                System.out.println("email: " + menuObject.getString("email"));
                System.out.println("password: " + menuObject.getString("password"));
                System.out.println();
                // do something with your JSON
            }

            fileReader.close();

        } catch (JSONException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

答案 4 :(得分:1)

s = s.replace("\\", "");
System.out.println(s);

您需要将修改后的String分配回s。这给出了一个适当的可解析JSON。

答案 5 :(得分:1)

我不知道为什么它不适合你。点网络Web服务确实以\响应,但Java能够解析它。我做了如下,它有效。

我的编码是这样的。

JSONArray users = null;
String jsStr =  "[{\"id\":\"1\",\"name\":\"Milos\",\"city\":\"Smederevo\",\"email\":\"milos\",\"password\":\"\"},{\"id\":\"3\",\"name\":\"Boban\",\"city\":\"Beograd\",\"email\":\"bole\",\"password\":\"\"},{\"id\":\"4\",\"name\":\"Pele\",\"city\":\"Brazil\",\"email\":\"pele@pele.com\",\"password\":\"\"}, {\"id\":\"5\",\"name\":\"admin\",\"city\":\"Smederevo\",\"email\":\"admin\",\"password\":\"\"}]";
try {
    users = new JSONArray(jsStr);
} catch (JSONException e) {
    e.printStackTrace();
}

Log.v("JSONStr", String.valueOf(users.length()));
for(int i = 0; i<users.length(); i++){
    try {
        Log.v("Name", users.getJSONObject(i).getString("name"));
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

请参阅LogCat

03-18 16:34:46.459: V/JSONStr(307): 4
03-18 16:34:46.479: V/Name(307): Milos
03-18 16:34:46.479: V/Name(307): Boban
03-18 16:34:46.479: V/Name(307): Pele
03-18 16:34:46.479: V/Name(307): admin

答案 6 :(得分:0)

我真的不喜欢各种String.replaceAll(rexex,“”)解决方案。如果JSON中的某些字符串包含\作为信息的一部分而不是格式化,该怎么办?我在你的JSON中看到了一个'密码'字段。我不知道这是明文还是哈希,但对于前者,如果用户在密码中使用反斜杠,您的程序可能会中断。

你想要做的是unescape一个字符串。这是一个问题,就我所知,用一个简单的正则表达式无法解决,但这是一个已经解决过数千次的问题。无需重新发明轮子。

How to unescape a string literal in java