2016-08-29 8 views
0

3つの可能なバリエーションを持つREST APIを解析しようとしています。最初のものは、私が既に働いているものです。下の写真に示すように、「行」出力の配列があるところです。Androidで3つの可能なバリエーションでREST APIを解析する方法

enter image description here

下図のように、対象となる行もあります。

enter image description here

そして最後に、以下に示すように、データが存在しない1。 enter image description here

これらのいずれかは、APIを解析する際に出力される可能性があります。どちらが出力であるかを知るにはif文のようなものが必要ですが、ifの作成方法はわかりませんこの特定の必要性のための声明。ここに私の現在のコードは次のとおりです:

JSONObject parentObject = new JSONObject(finalJson); 

        JSONObject responseJSON = JSONUtils.jsonObjectFromJSONForKey(parentObject, "response"); 
        if (responseJSON != null) { 
          JSONObject resultJSON = JSONUtils.jsonObjectFromJSONForKey(responseJSON, "result"); 
          JSONObject contactsJSON = JSONUtils.jsonObjectFromJSONForKey(resultJSON, "Potentials"); 
          JSONArray parentArray = contactsJSON.getJSONArray("row"); 


          List<Photoshoots> photoshootsList = new ArrayList<>(); 
          for (int i = 0; i < parentArray.length(); i++) { 
           JSONObject mainObject = parentArray.getJSONObject(i); 
           JSONArray mainArray = mainObject.getJSONArray("FL"); 
           Photoshoots photoshoot = new Photoshoots(); 

... 
+0

私の意見では、これは悪いデザインです。常に同じ構造体(この場合は配列)を返さなければなりません。これはarrayとか1か2の配列か空の配列 –

+0

私はScaryWombatの感想に同意します。結果を1つのオブジェクトに解析します。 「nodata」があるかどうか、または「行」を確認します。あなたが持っている情報が0以上の結果オブジェクトとオプションの説明的なメッセージ/コードで終わってしまうため、そこから残りの部分を処理してより代表的なものに張り付けることができます。つまり、配列や多分文字列です。あなたのビジネスロジックを*実行してください.Btwは、あなたが設計して変更できるAPIですか? –

答えて

0

私が持っていた問題を解決しました。それは問題を解決する理想的な方法ではないかもしれませんが、うまくいきます。 AsyncTaskのdoInBackgroundの中で、私は最初にJSON結果データをStringBufferに変換してから、StringBufferをStringに変換しました。私はその後、if文とif else文を使ってデータを解析しました。 JSON文字列がデータを以下に示し、私の元の基準に一致しないことを表す語句「NODATA」が含まれている場合、最初の文をチェックした場合:

if (finalJson.contains("nodata")) 

私はそれが後でonPostExecuteにチェックするNullデータを渡していました。次のelse if文がチェックされ、行が配列かどうかが確認されます。次のように私はその情報を解析さ

else if (finalJson.contains("{\"response\":{\"result\":{\"Potentials\":{\"row\":[")) 

JSONArray parentArray = contactsJSON.getJSONArray("row"); 


         for (int i = 0; i < parentArray.length(); i++) { 
          JSONObject mainObject = parentArray.getJSONObject(i); 
          JSONArray mainArray = mainObject.getJSONArray("FL"); 

私はそれをした方法は、以下に示す配列であったことを示し、行の後に[文字列があったかどうかを確認しました以下に示すように、それは、単にオブジェクトあっ示し、{行の後の代わりに[探して除き、ほぼ同じで、おそらくelse文である可能性が、もしそうでなければ、最終的な:

else if (finalJson.contains("{\"response\":{\"result\":{\"Potentials\":{\"row\":{")) 

それから解析されたth電子情報は、次のように:onPostExecuteの内部

JSONObject mainObject = contactsJSON.getJSONObject("row"); 
          JSONArray mainArray = mainObject.getJSONArray("FL"); 

、私は他のif文の両方に含まれている結果を得るためArrayAdapterを拡張するクラスを実行するコードがありますが、私はそれを実行したくありませんNODATAがある場合

protected void onPostExecute(List<Photoshoots> result) { 
       super.onPostExecute(result); 



       if (result != null) { 
    PhotoshootAdapter adapter = new PhotoshootAdapter(getApplicationContext(), R.layout.row, result); 
        lvPhotoshoots.setAdapter(adapter);} 

else{ 
    new CountDownTimer(60000, 1000) { 

         public void onTick(long millisUntilFinished) { 
          btnRefresh.setText("No Data to Show. Try again in " + millisUntilFinished/1000 + " Seconds"); 
         } 

         public void onFinish() { 
          btnRefresh.setText("Refresh"); 
          btnRefresh.setEnabled(true); 
         } 
        }.start(); 

結果がnullデータを渡しますが、結果内のデータがある場合は、リスト:データが存在しない場合、私は次のことをやりました。私が言ったように、この問題を解決する良い方法があるかもしれませんが、アプリケーションは今動作し、返されるデータに関係なくクラッシュしません。

+0

問題や質問の詳細を追加したり、それを回答として掲示する代わりに編集して質問する –

関連する問題