3

我有从服务器获取的 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”。A知道问题是由“\”引起的,我只是不知道如何摆脱“\”。

我试过:

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

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

请问有什么建议吗?

4

7 回答 7

5

试试这个解决方案。

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

这肯定会奏效。

于 2013-03-18T10:26:37.330 回答
4

问题已通过以下方式解决:

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

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

谢谢大家的帮助。

于 2013-03-18T12:17:23.917 回答
4

它对我有用...

在您的 json 中,“Your Json”的值包含在“”中,因此它被视为字符串而不是数组。

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

如果您可以修改服务器响应,请从 json 数组中删除“”。或首先将其解析为字符串,然后从该字符串创建一个 json 数组,例如..

String notes = jobj.getString("GetNotesResult");
jarray = new JSONArray(notes);
于 2014-05-15T12:19:48.630 回答
2

我不知道为什么它不适合你。点网 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
于 2013-03-18T11:07:17.120 回答
2

仅当您删除中间的反斜杠 () 时,您的 json 才有效。您可以使用类似: strJson = strJson.replaceAll("\\\\", "");strJson = strJson.replace("\\", "");删除 json 字符串之间的斜杠 ()。请注意,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();
        }

    }

}
于 2013-03-18T11:44:27.087 回答
1
s = s.replace("\\", "");
System.out.println(s);

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

于 2013-03-18T10:27:41.633 回答
0

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

你想要在这里做的是对字符串进行转义。据我所知,这是一个简单的正则表达式无法解决的问题,但这是一个已经解决了数千次的问题。无需重新发明轮子。

如何在java中对字符串文字进行转义

于 2013-03-18T10:41:28.997 回答