无法将Java字符串转换为JSON
我有从服务器获取的JSON:无法将Java字符串转换为JSON,java,android,json,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\":
"[{\"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线程):
要擦除“\”但替换,请不要做出任何反应。
我还试图解决“google-gson-2.2.2”库的问题(上面注释下的代码,在方法下)
有什么建议吗?试试这个解决方案
s.replaceAll("\\\\", "");
这肯定会奏效的
s = s.replace("\\", "");
System.out.println(s);
您需要将修改后的
字符串
分配回s
。这提供了一个合适的可解析JSON。我不太喜欢各种String.replaceAll(rexex,“”)解决方案。如果JSON中的某些字符串包含\作为信息的一部分而不是格式,该怎么办?我在JSON中看到一个“密码”字段。我不知道这是明文还是散列,但对于前者,如果用户在密码中使用反斜杠,您的程序可能会中断
这里要做的是取消对字符串的scape。就我所知,这是一个用简单的正则表达式无法解决的问题,但这是一个已经解决了数千次的问题。不需要重新发明轮子
我不知道为什么它不适合你。dotnetweb服务确实使用
\
响应,但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();
}
}
只有删除中间的反斜杠(),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();
}
}
}
package com.stackoverflow.com;
导入java.io.BufferedReader;
导入java.io.FileNotFoundException;
导入java.io.FileReader;
导入java.io.IOException;
导入org.json.JSONArray;
导入org.json.JSONException;
导入org.json.JSONObject;
公共类JsonTest{
公共静态void main(字符串[]args){
试一试{
FileReader FileReader=newfilereader(“C:/Users/sarath_sivan/Desktop/json.txt”);
BufferedReader br=新的BufferedReader(文件读取器);
StringBuilder strJsonBuilder=新StringBuilder();
弦斯特林;
而((strLine=br.readLine())!=null){
strJsonBuilder.append(strLine);
}
字符串strJson=strJsonBuilder.toString();
strJson=strJson.replaceAll(“\\\\”,”);/*或者您可以使用strJson=strJson.replace(“\\”,”)*/
JSONArray JSONArray=新JSONArray(strJson);
for(int i=0;i
问题已通过以下方式解决:
1) s = s.trim();
2) s = s.substring(1, s.length()-1);
3) s = s.replace("\\", "");
我的json在开头和结尾都用“双引号”进行了检索。我不知道字符串变量怎么会弄不明白“双引号”是指字符串的“开始”和“结束”
谢谢大家的帮助。它对我有用
在json中,“your json”的值包含在“”中,因此它被视为字符串而不是数组
因此,解决方案是两件事之一:
如果可以修改服务器响应,请从json数组周围删除“”。或者首先将其解析为字符串,然后从该字符串创建json数组,如
String notes = jobj.getString("GetNotesResult");
jarray = new JSONArray(notes);
我认为您需要修复服务器,而不是在客户端做额外的工作。您使用的服务器是什么?我会做s=s.replaceAll(“\\\”,“\”)代码>(替换\“by”,同时保持潜在的其他\未触及)我的服务器端很简单:返回jSearializer.Serialize(userList);它只是从“userList”返回序列化的json对象。net restful WS在IIS上运行。userList是用户对象的列表,非常有趣。你的例子用同样的方法为我工作。但是我的服务器json无法解析,即使他看起来和上面的字符串(jsStr)一样。也许我的json(我的字符串)有一些我看不到的隐藏字符。嗯,非常奇怪,我使用了许多具有相同逻辑的dot net服务。在解析字符串之前,您是否尝试过对其进行trim
处理?是的,这是可行的,但即使这样,我的json也无法解析为数组。我不知道我需要将我的字符串恢复到“s”,通常它在不恢复的情况下工作。
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();
}
}
}
1) s = s.trim();
2) s = s.substring(1, s.length()-1);
3) s = s.replace("\\", "");
String notes = jobj.getString("GetNotesResult");
jarray = new JSONArray(notes);