我正在调用Web服务来获取JSON字符串响应,并且它包含不是原始字符串的反斜杠。下面是我的请求JSON字符串对象的代码: {“name”:“Name”,“id”:1}
protected String doInBackground(String... uri)
{
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response;
String responseString = null;
try {
response = httpclient.execute(new HttpGet(uri[0]));
StatusLine statusLine = response.getStatusLine();
if(statusLine.getStatusCode() == HttpStatus.SC_OK){
ByteArrayOutputStream out = new ByteArrayOutputStream();
response.getEntity().writeTo(out);
out.close();
responseString = out.toString();
} else{
//Closes the connection.
response.getEntity().getContent().close();
throw new IOException(statusLine.getReasonPhrase());
}
} catch (ClientProtocolException e) {
//TODO Handle problems..
} catch (IOException e) {
//TODO Handle problems..
}
return responseString;
}
在post execute中我只是尝试将这个respose字符串解析为JSONObject。代码如下:
protected void onPostExecute(String result) {
super.onPostExecute(result);
TextView t1=(TextView)findViewById(R.id.textView1);
TextView t2=(TextView)findViewById(R.id.textView2);
//String s = result.replaceAll("\\", ""); //I have tried to escape backslashes also using this line.
String name="failure";
int id;
try
{
t1.setText(result);
JSONObject reader = new JSONObject(result.toString()); //Exception on this line.
//name = reader.getString("name").toString();
//id = reader.getInt("id");
t2.setText(name);
}
catch (Exception e)
{
t2.setText(e.toString());
}
}
Rsponse字符串是:“{\”name \“:\”Name \“,\”id \“:1}” 当我尝试将其解析为JSONObject时,它抛出一个异常说:org.json.JSONException value “{”name“:”Name“,”id“:1}”类型无法转换为json对象
答案 0 :(得分:1)
在请求中添加此标头解决了我的问题:
"Content-Type" = "application/x-www-form-urlencoded"
答案 1 :(得分:0)
我知道这是一个老问题,但我遇到了同样的问题,唯一的区别是,我有一个JSONArray而不是JSONObject。但是我在搜索Stackoverflow之后针对类似问题所遵循的问题的方法是我将在下面说明的方法,以防有人在我遇到你的问题时来寻找答案。
首先,您需要研究您收到的json响应。的" {\"名称\":\"名称\" \" ID为\":1}" 是一个字符串。您会在 {之后} 之前看到" 。如果这个字符串是你从你的web服务收到的原始json,那么你的方法来逃避反斜杠,然后从那个字符串中构建一个JSONObject应该有效。 您可以尝试的一种方法是:
result = result.trim();
result = result.substring(1,result.length() - 1);
result = result.replace("\\","");
然后,
JSONObject reader = new JSONObject(result);
name = reader.getString("name");
id = reader.getInt("id");
这个解决方案的口头禅是在json响应之前删除那些额外的引号,然后从该字符串创建一个JSONObject。
至于我关于JSONArray的情况,解决方案如下:
Json回复: {"错误":false," myorderdetails":{" order_id":" 26",& #34; orderjson":" [{\"名称\":\" Disprin \" \"标识\&#34 ;: 53,\"数量\":1,\" Price \":50}]"}}
JSONObject jObj = new JSONObject(response);
boolean error = jObj.getBoolean("error");
if (!error)
{
JSONObject jsonObj= jObj.getJSONObject("myorderdetails");
String s = jsonObj.getString("orderjson");
s = s.replace("\\", "");
JSONArray orderjson = new JSONArray(s);
for(int i=0;i<orderjson.length();i++){
JSONObject jsonObject=orderjson.getJSONObject(i);
String pname = (String)jsonObject.get("Name");
int pquantity = jsonObject.getInt("Quantity");
double pprice = jsonObject.getDouble("Price");
}
答案 2 :(得分:0)
查看列表消息转换器。看起来您的Json转换器(例如MappingJackson2HttpMessageConverter)位于StringMessageConverter之前。并且json在转义的每个字符串中都添加了转义字符'\'到'“'之前。