0

Java で解析しようとする JSON を返すサーバー呼び出しがあります。サーバーでエラーが発生した場合、error:error_name を含む JSON が返されます。

ただし、エラーがない場合、サーバーは 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\"}]
4

2 に答える 2

1

どちらの場合もjsonを貼り付けていただけますか?

通常、応答jsonは常に1つのjsonオブジェクトで囲む必要があります。これにより、応答を確認するときに、何を探すべきかが常にわかります。だから例えば

{"result": "ok"、data:[{"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*/ }

-プレマル

于 2013-03-13T05:58:29.913 に答える
1

エラーが発生していない場合、オブジェクトにキーob.getString("error")がないために発生している例外がへの呼び出しによってスローされます。"error"メソッドを使用してJSONObject#has、キーを取得する前にキーが存在するかどうかをテストするか、他の回答で説明されている Premal のようなアプローチに従います。

于 2013-03-13T06:10:43.803 に答える