2017-08-23 9 views
3

オブジェクト。私はJSONObjectsの上記セットを解析し、Javaに変換しています http://kolam.vicz.in:7890/games_gifs/奇妙な問題は、これは私が非常に奇妙な問題に直面しています初めてです

:私は、JSON本体用:

リンク(カントが原因で文字の制限をここでJSON本体を貼り付け)の下JSONObjectを言及していますオブジェクト。以下は、このJSON本体を解析するコードです。

private void getGameList() { 
     StringRequest request = new StringRequest(Request.Method.GET, gameUrl, new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 
       try { 
        JSONObject mainObject = new JSONObject(response); 
        JSONArray gamesArray = mainObject.getJSONArray("TracingGames"); 
        Log.e(TAG, "gameArray length:" + gamesArray.length()); 
        for (int i = 0; i < gamesArray.length(); i++) { 
         JSONObject obj = gamesArray.getJSONObject(i); 
         for (String str : getKeys(obj)) { 
          Log.e(TAG, str); 
          if (str.equalsIgnoreCase("kolam")) { 

           /*Section for Learn and Kolam Tracing games start*/ 
           //TODO: Need to add the game names to the object (Need server side implementation as well) 
           KolamTracingGames kolamTracingGames = new KolamTracingGames(); 
           kolamTracingGames.setKolamGifPath(obj.getString("path")); 
           kolamTracingGames.setKolamLevel(Integer.parseInt(str)); 
           kolamTracingGames.setKolamGameName("Kolam Tracing"); 
           kolamTracingGames.setX(getXCoordinates(obj)); 
           kolamTracingGames.setY(getYCoordinates(obj)); 
           kolamObjects.add(kolamTracingGames); 
           break; 
          } else if (str.equalsIgnoreCase("level")) { 
           LearnTracingGames learnTracingGames = new LearnTracingGames(); 
           learnTracingGames.setLearnGameGifPath(obj.getString("path")); 
           learnTracingGames.setLearnGameLevel(Integer.parseInt(str)); 
           learnTracingGames.setGameName("Learn Game"); 
           learnTracingGames.setX(getXCoordinates(obj)); 
           learnTracingGames.setY(getYCoordinates(obj)); 
           learnGameObjects.add(learnTracingGames); 
           Log.e(TAG, learnGameObjects.size() + ""); 
           break; 
          } 
         } 
        } 

        if (gameType.equalsIgnoreCase("Trace the Kolam")) { 
         kolamTraceAdapter = new KolamTraceAdapter(getActivity()); 
         kolamTraceAdapter.getGameList(kolamObjects); 
         recyclerView.setAdapter(kolamTraceAdapter); 
        } else if (gameType.equalsIgnoreCase("Learn")) { 
         learnGameAdapter = new LearningGameAdapter(getActivity()); 
         learnGameAdapter.getGameList(learnGameObjects); 
         Log.e(TAG, "learngameobject size:" + learnGameObjects.size()); 
         recyclerView.setAdapter(learnGameAdapter); 
         Log.e(TAG, "Learn games"); 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       Log.e(TAG, error.getMessage()); 
       if (getActivity() != null) { 
        Alerter.create(getActivity()) 
          .setTitle(R.string.warning) 
          .setText(R.string.network_error) 
          .setDuration(2000) 
          .setBackgroundColorRes(R.color.dot_dark_screen1) 
          .show(); 
       } 
      } 
     }); 
     request.setTag(TAG); 
     request.setRetryPolicy(new DefaultRetryPolicy(30000, 5, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 
     AppController.getInstance().addToRequestQueue(request); 

私の問題は8 レベル型オブジェクトと4つのkolamオブジェクトは(明確にするためにJSON体を参照)があります。私はそれらのために2つの別々のPOJOクラスを持っています。私は適切にJSON本体を解析することですが、私はにしようとしていますとき、Javaは最も内側のfor loopが完全に実行されていないものをJSONObjectsのオブジェクトを作成します。 1ループ後に停止します。

forループの内側は、(Javaオブジェクトの作成)(一度だけ実行するが、より多くのそして12回実行取得する必要があります)完全に実行取得されていない私はこれをやっている場合:

for (int i = 0; i < gamesArray.length(); i++) { 
         JSONObject obj = gamesArray.getJSONObject(i); 
         for (String str : getKeys(obj)) { 
          Log.e(TAG, str); 
          if (str.equalsIgnoreCase("kolam")) { 

           /*Section for Learn and Kolam Tracing games start*/ 
           //TODO: Need to add the game names to the object (Need server side implementation as well) 
           KolamTracingGames kolamTracingGames = new KolamTracingGames(); 
           kolamTracingGames.setKolamGifPath(obj.getString("path")); 
           kolamTracingGames.setKolamLevel(Integer.parseInt(str)); 
           kolamTracingGames.setKolamGameName("Kolam Tracing"); 
           kolamTracingGames.setX(getXCoordinates(obj)); 
           kolamTracingGames.setY(getYCoordinates(obj)); 
           kolamObjects.add(kolamTracingGames); 
           break; 
          } else if (str.equalsIgnoreCase("level")) { 
           LearnTracingGames learnTracingGames = new LearnTracingGames(); 
           learnTracingGames.setLearnGameGifPath(obj.getString("path")); 
           learnTracingGames.setLearnGameLevel(Integer.parseInt(str)); 
           learnTracingGames.setGameName("Learn Game"); 
           learnTracingGames.setX(getXCoordinates(obj)); 
           learnTracingGames.setY(getYCoordinates(obj)); 
           learnGameObjects.add(learnTracingGames); 
           Log.e(TAG, learnGameObjects.size() + ""); 
           break; 
          } 
         } 
        } 

getKeys(JSONObject)方法は以下の通りです:私はfor loop内のオブジェクトを作成しない場合は

private static String[] getKeys(JSONObject firstJSONObject) { 
     Iterator keysToCopyIterator = firstJSONObject.keys(); 
     List<String> keysList = new ArrayList<>(); 
     while (keysToCopyIterator.hasNext()) { 
      String key = (String) keysToCopyIterator.next(); 
      keysList.add(key); 
     } 
     return keysList.toArray(new String[keysList.size()]); 
    } 

はしかし、その後、内側for loopが完全に実行されます。

+0

をフェッチ代わりstrを使用しないでください?あなたがAndroid上にいることを確認して、例えば、 'Gson'? 原因それは理論的には、 'KolamTracingGmaesゲーム=新しいGsonを()書くのと同じくらい簡単である可能性があります。fromJson(応答、KolamTracingGames.class)' –

+0

私は私ができる..私はすべての可能な方法を試してみましたあなたは 'break'声明 –

+0

を持っていると思いましたこれらのJavaオブジェクトを作成していない場合は、JSON本体を簡単に完全に解析します。これらのオブジェクトをコメントするだけで、setterメソッドの行はコードを正常に実行します。しかし、私は上記のコードを実行する場合。そして、それだけで – XoXo

答えて

2

しかし、forループ内でオブジェクトを作成しないと、 ループの内部が完全に実行されます。

はっきり

説明

クラッシュで

Integer.parseInt("level")またはInteger.parseInt("kolam")その後、if (str.equalsIgnoreCase("kolam"))またはelse if (str.equalsIgnoreCase("level")) {試合のあなたの任意の

は、あなたが明確にここにクラッシュを持って、Integer.parseInt(str)strはどちらかlevelになりますので、またはkolamintegers

明確にされていません

ソリューション:なぜあなたはJSONを自分で解析しようとしている...ただ、好奇心から値

if (str.equalsIgnoreCase("kolam")) { 
    //... code 
    kolamTracingGames.setKolamLevel(obj.optInt(str)); 
    //... code      ^^^^^^^^^^^^^^^ 
    break; 
} else if (str.equalsIgnoreCase("level")) { 
    //... code 
    learnTracingGames.setLearnGameLevel(obj.optInt(str)); 
    //... code       ^^^^^^^^^^^^^^^ 
    break; 
} 
+0

すばらしい解決策。私はちょうど私の家から出ました..一度正常に実行され更新されます..驚くべき男。ありがとうございました – XoXo

+0

@Hiren私は幸せなコードを助けることができてうれしいです –

+0

私はちょうど知りたかった。なぜJavaコンパイラはそれに関するエラーや例外を投げなかったのですか? – XoXo

関連する問題