我有一个返回JSON的服务器调用,我试图用Java解析它。如果服务器上有错误,则返回JSON,错误:error_name
但如果没有错误,服务器将返回JSON内的数据。
当我检查是否有错误时,我当前设置解析的方式会崩溃。这就是我所拥有的:
try
{
JSONArray obj = new JSONArray(result);
if ( obj != null )
{
discussion.clear();
if ( obj.length() == 0 )
{
DiscussionMessage message = new DiscussionMessage ( );
discussion.add( message );
}
else
{
JSONObject ob = obj.getJSONObject(0);
String error = ob.getString("error");
if (error != null &&
( error.equals("no_problem_id") ||
error.equals("error_adding_suggested_solution_comment") ||
error.equals("no_recent_topic_id") ||
error.equals("no_comment") ||
error.equals("no_member_id") ||
error.equals("no_plan_id") ||
error.equals("error_duplicate_topic_comment") )
)
{
{
Toast.makeText(getApplicationContext(), "Could not get the current discussion.", Toast.LENGTH_LONG).show();
sendEmail("Add business comment error response" , "Error response from server. Response: " + result);
}
}
else if ( error != null && error.equals("no_email_in_public_plan"))
{
Toast.makeText(getApplicationContext(),"Unexpected error. Please let us know about this" , Toast.LENGTH_LONG).show();
sendEmail("Error adding fundraising comment" , "Empty email adding fundraising plan comment");
}
else
{
try
{
for ( int i = 0; i < obj.length(); i++ )
{
JSONObject o = obj.getJSONObject(i);
//String suggested_solution_id = o.getString("suggested_solution_id");
String comment = o.getString("comment");
String commenter_id = o.getString("commenter_id");
String comment_id = o.getString("comment_id");
String first_name = o.getString("first_name");
String is_private = o.getString("privacy");
}
}
catch ( Exception e )
{
}
}
}
}
}
catch ( Exception e )
{
}
我尝试发送和解析此JSON的方式是否存在根本不正确的问题?感觉如此:)
请帮助我了解这样做的正确方法 感谢。
以下是崩溃错误:
Exception: No value for error , and result was: [{\"comment_id\":\"24\",\"plan_id\":\"20\",\"commenter_id\":\"1\",\"comment\":\"test\",\"solution_part\":\"1\",\"date\":\"2013-03-13\",\"first_name\":\"Alex\",\"privacy\":\"0\"},{\"comment_id\":\"25\",\"plan_id\":\"20\",\"commenter_id\":\"55018\",\"comment\":\"hi\",\"solution_part\":\"1\",\"date\":\"2013-03-13\",\"first_name\":\"Sddggh\",\"privacy\":\"0\"}]
答案 0 :(得分:1)
在这两种情况下你能粘贴你的json吗?
通常你应该总是将你的响应json包含在一个json对象中,所以当你查看响应时,你总是知道要查找什么。 所以例如
{“result”:“ok”,数据:[{“data1”:“value1”,“data2”:“value2”}}}
或
{ “结果”: “错误”}
因此您的代码非常简化
JSONObject responseObj = new JSONObject(responseString);
String result = responseObject.get("result");
if(result.equalsIgnoreCase("ok")
{ /* handle good case */
JSONArray list = (JSONArray)responseObj.get("data");
for(...) {}
}
else { /* handle error case*/ }
-Premal
答案 1 :(得分:1)
如果您没有错误,则对ob.getString("error")
的调用会抛出您遇到的异常,因为对象中没有"error"
键。使用JSONObject#has
方法在尝试获取密钥之前测试密钥是否存在,或者按照其他答案中列出的Premal方法进行测试。