У меня возникли некоторые проблемы при попытке создать 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.
Может быть, есть какой-то способ подавления ошибки в этой конкретной строке кода?
Заранее благодарю и извиняюсь за небрежное форматирование содержания моих вопросов.
Таким образом, одно из самых простых решений - заменить строку на NaN.
myjsonstring = myjsonstring.replaceAll("NaN", -1 /*Or whatever you need*/);
//Now you can do your work as it is
JSONObject jsonObjMain = new JSONObject(myjsonstring);