Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解析JSONObject并转换为Java对象时出现奇怪的问题_Java_Android_Json - Fatal编程技术网

解析JSONObject并转换为Java对象时出现奇怪的问题

解析JSONObject并转换为Java对象时出现奇怪的问题,java,android,json,Java,Android,Json,这是我第一次面对一个非常奇怪的问题。我有一个JSONObject,如下所述: JSON正文的链接(由于字符限制,无法在此处粘贴JSON正文): 我正在解析上述一组JSONObject并将它们转换为Java对象。下面是我解析这个JSON主体的代码 private void getGameList() { StringRequest request = new StringRequest(Request.Method.GET, gameUrl, new Response.Liste

这是我第一次面对一个非常奇怪的问题。我有一个JSONObject,如下所述:

JSON正文的链接(由于字符限制,无法在此处粘贴JSON正文):

我正在解析上述一组JSONObject并将它们转换为Java对象。下面是我解析这个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);
getKeys(JSONObject)
方法如下:

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()]);
    }
private static String[]getKeys(JSONObject firstJSONObject){
迭代器keystopyIterator=firstJSONObject.keys();
List keysList=new ArrayList();
while(keystCopyIterator.hasNext()){
字符串键=(字符串)keystopyIterator.next();
keysList.add(key);
}
返回keysList.toArray(新字符串[keysList.size()]);
}
但是如果我避免在
for循环
中创建对象,那么内部
for循环
将完全运行

但是如果我避免在for循环中创建对象,那么内部for 循环完全运行

Integer.parseInt(“level”)
Integer.parseInt(“kolam”)
这显然是一个崩溃

解释

当您的
if(str.equalsIgnoreCase(“kolam”)
else if(str.equalsIgnoreCase(“level”){
匹配时

这里显然出现了崩溃,
Integer.parseInt(str)
,因为
str
将是
level
kolam
,它们显然不是
Integer

解决方案:不要使用
str
而是获取值

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;
}

出于好奇…你为什么要自己解析JSON?既然你在安卓系统上,你有没有考虑过使用例如
Gson
?因为从理论上讲,编写
KolamTracingGames=new Gson()。fromJson(response,KolamTracingGames.class)
我以为你有
break
语句我已经尝试了所有可能的方法。如果我不创建那些Java对象,我可以轻松完整地解析JSON正文。只注释那些对象setter方法行可以使代码成功运行。但是如果我运行上面的代码。那么它只运行1次timebreak语句不是p这里有问题。@Yohannes很好的解决方案。我刚从家里出来。一旦运行成功,将进行更新。了不起的人。谢谢ton@Hiren我很高兴我能帮上忙,happy Coding我只是想知道。为什么java编译器没有抛出任何错误或异常呢?@Hiren,因为你应用了
try-catch
并使用了e> 异常将处理每个异常,但仍然可以通过
e.printStackTrace()在logcat中获得异常详细信息
虽然要引起崩溃,只需为必要的解析异常(如
JSONException
捕获预期异常以进行快速调试而不是异常)添加捕获块,但最好使用replace
catch(Exception e){
with
catch(JSONException e){
查看NumberFormatException
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;
}