【问题标题】:Java String conversion to JSON can not be done无法完成 Java 字符串到 JSON 的转换
【发布时间】:2015-04-22 17:31:40
【问题描述】:

我有从服务器获取的 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”库的问题(上面评论下的代码,方法下)。

有什么建议吗?

【问题讨论】:

  • 我认为你需要修复你的服务器而不是在客户端做额外的工作
  • 你用的是什么服务器?
  • 我会做s = s.replaceAll("\\\"", "\"");(用“替换\”,同时保留潜在的其他\不变)
  • 我的服务器端很简单:return jSearializer.Serialize(userList);它只是从“userList”返回序列化的 json 对象。
  • .net restful WS,在 IIS 上运行。 userList 是用户对象的列表。

标签: java android json


【解决方案1】:

试试这个解决方案。

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

这肯定行得通。

【讨论】:

    【解决方案2】:

    问题已解决:

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

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

    感谢大家的帮助。

    【讨论】:

      【解决方案3】:

      它对我有用...

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

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

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

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

      【讨论】:

        【解决方案4】:

        我不知道为什么它不适合你。点网 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
        

        【讨论】:

        • 这很有趣。您的示例以相同的方法为我工作。但是无法解析来自服务器的我的 json,即使他看起来与上面的字符串(jsStr)相同。也许我的 json(我的字符串)有一些我看不到的覆盖字符。
        • 嗯,非常奇特,我用过许多具有相同逻辑的点网服务。你在解析之前尝试过trim这个字符串吗?
        【解决方案5】:

        只有删除中间的反斜杠 () 时,您的 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();
                }
        
            }
        
        }
        

        【讨论】:

          【解决方案6】:
          s = s.replace("\\", "");
          System.out.println(s);
          

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

          【讨论】:

          • 是的,它可以工作,但即使这样,我的 json 也无法解析为数组。我不知道我需要将我的字符串检索回“s”,通常它无需检索即可工作。
          【解决方案7】:

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

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

          How to unescape a string literal in java

          【讨论】:

            猜你喜欢
            • 2013-12-02
            • 2020-07-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-14
            • 1970-01-01
            • 2019-06-21
            • 1970-01-01
            相关资源
            最近更新 更多