Java 无法将服务器中的字符串转换为JSONObject?
我的服务器通过HTTP POST响应的主体返回一个JSON对象,但当我的应用程序尝试将字符串转换为JSONObject时,我收到以下错误:Java 无法将服务器中的字符串转换为JSONObject?,java,android,json,http,Java,Android,Json,Http,我的服务器通过HTTP POST响应的主体返回一个JSON对象,但当我的应用程序尝试将字符串转换为JSONObject时,我收到以下错误: 06-02 09:05:34.380: E/JSONException_MyAppService(19913): org.json.JSONException: Value {"VALS":{"VAL1":"hello","VAL2":"hello2","VAL3":"hello3"}} of type java.lang.String cannot be
06-02 09:05:34.380: E/JSONException_MyAppService(19913): org.json.JSONException: Value {"VALS":{"VAL1":"hello","VAL2":"hello2","VAL3":"hello3"}} of type java.lang.String cannot be converted to JSONObject
看起来我的服务器正在返回一个可接受的JSON编码字符串,但它不会转换为JSONObject。我甚至将服务器响应头的内容类型更改为“application/json”。请帮我修一下,我已经试了一整天了
编辑-我使用以下代码:
try {
ResponseHandler<String> responseHandler=new BasicResponseHandler();
String responseBody = client.execute(post, responseHandler);
JSONObject response=new JSONObject(responseBody);
} catch (ClientProtocolException e) {
e.printStackTrace();
Log.e("ClientProtocol_"+TAG,""+e);
} catch (ClientProtocolException e) {
e.printStackTrace();
Log.e("IO_"+TAG,""+e);
} catch (ClientProtocolException e) {
e.printStackTrace();
Log.e("JSONException_"+TAG,""+e);
}
:'(:'(你是怎么做的?它应该与:
JSONObject object = new JSONObject (yourString);
您可以将字符串转换为json,如下所示:
String str="{\"VALS\":{\"VAL1\":\"hello\",\"VAL2\":\"hello2\",\"VAL3\":\"hello3\"}}";
try {
JSONObject result = new JSONObject(str);
JSONObject resultf = result.getJSONObject("VALS");
Toast.makeText(this, resultf.getString("VAL1").toString(), Toast.LENGTH_SHORT).show();
Toast.makeText(this, resultf.getString("VAL2").toString(), Toast.LENGTH_SHORT).show();
Toast.makeText(this, resultf.getString("VAL3").toString(), Toast.LENGTH_SHORT).show();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我修复了它!这完全是我的服务器的错误。结果是我的服务器响应不正确。发生的是web框架中存在错误,在更新到最新版本后,问题自行解决。我猜web框架的旧版本返回了不正确的内容类型响应头,或者使用了some奇怪的编码 所以这里每个人的Java代码都应该是100%正确的,因为Java在这里并没有错。谢谢你们的努力
Miguel的回答是最贴切的解释,所以我接受他的回答。你能编辑你的问题,包括你得到回答的代码吗?我已经尝试解析你的回答,它正在工作。我不知道你是如何传递字符串的,但也许你必须替换引号\"在我看来,您的代码看起来是正确的。在转换为JSONObject之前记录responseBody字符串会很有趣,以查看您得到了什么。我认为问题出在字符串中。可能有一些引号。您可以尝试将您得到的字符串作为响应登录到Eclipse并复制到此处吗?我尝试使用您的响应和它可以工作:JSONObject object=new JSONObject(“{“VALS\”:{“VAL1\”:“hello\”,“VAL2\”:“hello2\”,“VAL3\”:“hello3\”}”);让我们提供您执行相同操作和完整日志cat的代码……尝试我的答案,如果您有任何问题,我将指导您,我认为这将失败,因为响应中没有数组(对于数组)[]是必需的)。VAL应该被解析为JSONObject。@miguel.rodelas:也许你是对的,但你可以在这里检查我尝试了,但它给出了完全相同的错误消息(我保留了以前代码中相同的catch子句)@user1408996:至少在Android中,它是一个JSONObject,具有VAL1、VAL2和VAL3作为字符串属性,100%确定。我刚刚在Eclipse上尝试过它,使用JSONArray您会得到一个JSONException。
String str="{\"VALS\":{\"VAL1\":\"hello\",\"VAL2\":\"hello2\",\"VAL3\":\"hello3\"}}";
try {
JSONObject result = new JSONObject(str);
JSONObject resultf = result.getJSONObject("VALS");
Toast.makeText(this, resultf.getString("VAL1").toString(), Toast.LENGTH_SHORT).show();
Toast.makeText(this, resultf.getString("VAL2").toString(), Toast.LENGTH_SHORT).show();
Toast.makeText(this, resultf.getString("VAL3").toString(), Toast.LENGTH_SHORT).show();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
if (entity != null) {
String retSrc = EntityUtils.toString(entity);
// parsing JSON
JSONObject result = new JSONObject(retSrc); //Convert String to JSON Object
JSONObject object2 = result.getJSONObject("VALS");
String token = object2.getString("VAL1");
String token = object2.getString("VAL2");
String token = object2.getString("VAL3");
}
}
catch (Exception e) {
}