«Org.json.JSONException: запрещенное числовое значение: NaN»

1

У меня возникли некоторые проблемы при попытке создать JSONObject из строки.

try {
                    JSONObject jsonObjMain = new JSONObject(myjsonstring);
                    final JSONArray jsonArray = jsonObjMain.getJSONArray("Waypoints");
                    AsyncTask.execute(() -> {
                        for (int i = 0; i < jsonArray.length(); i++) {

                            JSONObject jsonObj;
                            try {
                                jsonObj = jsonArray.getJSONObject(i);

                                latL.add(jsonObj.getDouble("Latitude"));
                                lonL.add(jsonObj.getDouble("Longitude"));
                                name.add(jsonObj.getString("Name"));

                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }

                    });


                } catch (JSONException e) {
                    e.printStackTrace();
                }

Журналы ошибок:

2018-12-28 14:06:32.394 30282-30408/com.virtualflight.virtuallink I/System.out: Message received from the server : �����{"Result":0,"Type":"Fds.IFAPI.APIFlightPlan","Bearing":97.74833,"DesiredTrack":113.921631,"DistanceToDestination":20.7412319,"DistanceToNext":20.7412319,"ETAToDestination":NaN,"ETAToNext":NaN,"ETEToDestination":3.63384724,"ETEToNext":3.63384724,"ICAO":null,"NextWaypointLatitude":37.69588,"NextWaypointLongitude":-122.455284,"Track":284.077728,"WaypointName":"DUXBY","Waypoints":[{"Code":"WPT","Latitude":37.613646941754411,"Longitude":-122.35739898939444,"Name":"WPT"},{"Code":null,"Latitude":37.6826,"Longitude":-122.52375,"Name":"KYNNG"},{"Code":null,"Latitude":37.72509444,"Longitude":-122.5029,"Name":"VPSLM"},{"Code":null,"Latitude":37.69588056,"Longitude":-122.45528611,"Name":"DUXBY"}]}

2018-12-28 14: 06: 32.396 30282-30408 /com.virtualflight.virtuallink W/System.err: org.json.JSONException: Запрещенное числовое значение: NaN 2018-12-28 14: 06: 32.397 30282-30408 /com.virtualflight.virtuallink W/System.err: at org.json.JSON.checkDouble(JSON.java:25) 2018-12-28 14: 06: 32.397 30282-30408 /com.virtualflight.virtuallink W/System.err: at org.json.JSONObject.put(JSONObject.java:265) 2018-12-28 14: 06: 32.397 30282-30408 /com.virtualflight.virtuallink W/System.err: at org.json.JSONTokener.readObject( JSONTokener.java:384) 2018-12-28 14: 06: 32.397 30282-30408 /com.virtualflight.virtuallink W/System.err: at org.json.JSONTokener.nextValue(JSONTokener.java:100) 2018-12- 28 14: 06: 32.397 30282-30408 /com.virtualflight.virtuallink W/System.err: at org.json.JSONObject. (JSONObject.java:159) 2018-12-28 14: 06: 32.397 30282-30408 /com.virtualflight.virtuallink W/System.err: at org.json.JSONObject. (JSONObject.java:176) 2018-12-28 14: 06: 32.397 30282-30408 /com.virtualflight.virtuallink W/System.err: at com.virtua lflight.virtuallink.MainActivity $ SendCommand.doInBackground(MainActivity.java:174) 2018-12-28 14: 06: 32.398 30282-30408 /com.virtualflight.virtuallink W/System.err: на com.virtualflight.virtuallink.MainActivity $ SendCommand.doInBackground(MainActivity.java:116) 2018-12-28 14: 06: 32.398 30282-30408 /com.virtualflight.virtuallink W/System.err: at android.os.AsyncTask $ 2.call(AsyncTask.java:333) ) 2018-12-28 14: 06: 32.398 30282-30408 /com.virtualflight.virtuallink W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:266) 2018-12-28 14: 06: 32.398 30282-30408 /com.virtualflight.virtuallink W/System.err: at android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:245) 2018-12-28 14: 06: 32.398 30282-30408 /com.virtualflight.virtuallink W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 2018-12-28 14: 06: 32.399 30282-30408 /com.virtualflight.virtuallink W/System.err: at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:641) 2018-12-28 14: 06: 32.399 30282-30408 /com.virtualflight.virtuallink W/System.err: at java.lang.Thread.run(Thread.java:764)

Теперь я думаю, что знаю, в чем проблема, но я не знаю, как на самом деле ее исправить. По сути, я думаю, что это потому, что "ETAToDestination" и "ETAToNext" возвращают значения "NaN" вместо Integer или Double, поэтому строка не может быть преобразована в JSONObject. Будут случаи, когда эти 2 значения будут иметь числовое значение вместо NaN.

Может быть, есть какой-то способ подавления ошибки в этой конкретной строке кода?

Заранее благодарю и извиняюсь за небрежное форматирование содержания моих вопросов.

Теги:

1 ответ

0
Лучший ответ

Таким образом, одно из самых простых решений - заменить строку на NaN.

myjsonstring = myjsonstring.replaceAll("NaN", -1 /*Or whatever you need*/);

//Now you can do your work as it is
JSONObject jsonObjMain = new JSONObject(myjsonstring);
  • 0
    Огромное спасибо. Это сработало!
  • 1
    Это может работать во многих случаях, но если JSON всегда идет без пробелов, можно заменить «: NaN» на «: -1,», что было бы безопаснее. С помощью регулярных выражений можно было бы обрабатывать также JSON с пробелами.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню