无法将Java字符串转换为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\":

我有从服务器获取的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线程):

要擦除“\”但替换,请不要做出任何反应。 我还试图解决“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);