Java &引用;org.json.JSONException:禁止的数值:NaN“;
我在尝试从字符串创建JSONObject时遇到了一些问题Java &引用;org.json.JSONException:禁止的数值:NaN“;,java,android,json,Java,Android,Json,我在尝试从字符串创建JSONObject时遇到了一些问题 try { JSONObject jsonObjMain = new JSONObject(myjsonstring); final JSONArray jsonArray = jsonObjMain.getJSONArray("Waypoints"); AsyncTask.execute(() -> {
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.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:org.json.JSONTokener.readObject(JSONTokener.java:384)
2018-12-28 14:06:32.397 30282-30408/com.virtualflight.virtuallink W/System.err:org.json.JSONTokener.nextValue(JSONTokener.java:100)
2018-12-28 14:06:32.397 30282-30408/com.virtualflight.virtuallink W/System.err:org.json.JSONObject.(JSONObject.java:159)
2018-12-28 14:06:32.397 30282-30408/com.virtualflight.virtuallink W/System.err:org.json.JSONObject.(JSONObject.java:176)
2018-12-28 14:06:32.397 30282-30408/com.virtualflight.virtuallink W/System.err:at com.virtualflight.virtuallink.MainActivity$SendCommand.doInBackground(MainActivity.java:174)
2018-12-28 14:06:32.398 30282-30408/com.virtualflight.virtuallink W/System.err:at 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”值而不是整数或双精度值,因此字符串不能转换为JSONObject。在某些情况下,这两个值将包含一个数值,而不是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);
你从哪里获得json字符串?@FarhanQasim我从游戏中获得它API@dragospopa,这由你控制吗?为什么它返回
NaN
s,您能让它返回其他内容吗?如果您查看JSON.stringify部分,注意4,NaN
对于JSON.stringify不是有效的结果,它必须是null
。也不允许NaN
值(更准确地说,这些值不能用十进制数字字符串表示)。@M.Prokhorov API不在我的控制范围内。感谢您的帮助,但是Kousik Mandal的答案很有效。这在很多情况下可能有效,但是如果JSON总是没有空格,那么可以将“:NaN”替换为“:-1”,这样会更安全。使用正则表达式,还可以处理带有空格的JSON。当回答一个旧问题时,如果您包含一些上下文来解释您的答案是如何帮助的,那么您的答案对其他StackOverflow用户会更有用,特别是对于一个已经有公认答案的问题。请参阅:。
myjsonstring = myjsonstring.replaceAll("NaN", -1 /*Or whatever you need*/);
//Now you can do your work as it is
JSONObject jsonObjMain = new JSONObject(myjsonstring);
double defaultValue = 0.0;
double myDouble = jsonObj.getDouble("Latitude");
latL.add(Double.isNaN(myDouble) ? defaultValue : myDouble);