2013-03-18 49 views
2

我有JSON这是我从服务器获取:Java的字符串转换为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\":\"[email protected]\",\"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

我认为你需要修复你的服务器,而不是做你使用的是什么服务器在客户端 – waqaslam 2013-03-18 10:26:05

+0

额外的工作? – waqaslam 2013-03-18 10:29:08

+0

我会做's = s.replaceAll(“\\\”“,”\“”);'(用\替换\“,同时让潜在的其他\不变) – njzk2 2013-03-18 10:29:32

回答

3

问题已经解决了:

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

我的JSON已经检索在开头和结尾都加上“双引号”。我不知道字符串变量是如何找不到“双引号”是用于字符串的“开始”和“结尾”的。

谢谢大家的帮助。

4

试试这个解决方案。

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

这一定会奏效。

1
s = s.replace("\\", ""); 
System.out.println(s); 

您需要将修改的String指定回s。这给出了一个合适的可解析JSON。

+0

是的,这是工作,但即使如此,我的JSON不能被解析为数组。我不知道我需要将我的字符串恢复为“s”,通常它不起作用。 – Milos 2013-03-18 11:39:56

0

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

你想在这里做什么是一个字符串。这是一个问题,据我所知,不能用简单的正则表达式解决,但这是一个已经解决了数千次的问题。没有必要重新发明轮子。

How to unescape a string literal in java

1

我不知道为什么它不为你工作。 DotNet网络服务确实以\响应,但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\":\"[email protected]\",\"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 
+0

这很有趣。你的例子以相同的方法为我工作。但是我的服务器json不能被解析,即使他看起来和你上面的字符串(jsStr)一样。也许我的json(我的字符串)有一些我看不到的有特色的角色。 – Milos 2013-03-18 11:36:21

+0

嗯非常奇特我用同样的逻辑使用了许多点网络服务。在分析之前,你是否尝试过修剪字符串? – 2013-03-18 12:03:02

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\":\"[email protected]\",\"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(); 
     } 

    } 

} 
+0

谢谢你的明确解释。 – Milos 2013-03-18 12:18:28

+0

您随时欢迎... – 2013-03-18 12:33:45

4

这是为我工作...

在你的JSON“您的JSON”的值inclused内“”所以它被认为是一个字符串,而不是一个数组..

因此,解决办法是一个的两件事:

如果你可以修改服务器响应,删除“”从json数组周围。或者先分析它的字符串,然后创建该字符串像一个JSON数组..

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