我有从服务器获得的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”库解决问题(上面评论下的代码,在方法下)。
请问任何建议?
答案 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一个字符串。这是一个问题,就我所知,用一个简单的正则表达式无法解决,但这是一个已经解决过数千次的问题。无需重新发明轮子。