我在使用JSON和Java时遇到了麻烦,我有一个工作功能将数据结构导出到JSON并将其保存在文件中。但是,当我尝试执行相反操作并将数据strucutre导入回Java时,出现错误,其输出为:
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at .....
Caused by: java.lang.RuntimeException: JSONObject["nodeID"] not found.
at processing.data.JSONObject.get(JSONObject.java:549)
at processing.data.JSONObject.getString(JSONObject.java:568)
at Graph.loadJSON(Graph.java:934)
... 21 more
从该错误中,我认为在节点内找不到字符串“ nodeID”,但它在JSON输出中,如下所示:
{"network": [
{"node": {
"nodeID": "1",
"radius": 40
"atom": {
"id": "a-2675-EH",
"activeTime": 0,
"type": "Motor",
"linkFrom": [{
"atomID": "a-2312-TL",
"delay": 0.20000000298023224
}],
"linkTo": [{
"atomID": "a-3289-Ql",
"delay": 0.20000000298023224
}]
},
.....
JSON代码是网络中包含的节点的数组,然后每个节点对象都包含一个字符串nodeID和3个Float变量,然后是一个称为atom的对象。然后,该原子包含两个字符串,一个浮点数和两个名为linkTo和linkFrom的数组,它们包含表示链接的对象(atomID和delay,分别为string和float)
从网络加载每个节点的Java代码如下所示:
JSONObject network = loadJSONObject(selection.getAbsolutePath());
JSONArray nodes = network.getJSONArray("network");
for (int i=0; i<nodes.size(); i++)
{
//Load node
JSONObject node = nodes.getJSONObject(i);
String nodeID = node.getString("nodeID"); <-- Error occurs here
Float x = node.getFloat("x");
Float y = node.getFloat("y");
Float radius = node.getFloat("radius");
JSONObject atom = node.getJSONObject("atom");
.....
我确定我只是缺少一些简单的东西,但是我花了近一个星期的时间来尝试调整它,却一无所获!
我知道节点正在正确加载,因为for循环内的println(node)语句完全按照应有的方式打印出了该节点,它只是试图获取似乎不起作用的nodeID。即使我更改顺序并尝试获取也会引起错误的x或y浮点数。
谢谢。
最佳答案
正如我的评论所说,
用node.getString("nodeID");
替换node.getJSONObject("node").getString("nodeID");
应该可以解决问题。
这是因为getJSONArray()
在方括号内为您提供了所有JSON对象。 node.getString("nodeID");
实际上在JSONObject下方给出,
{“ node”:{“ nodeID”:“ 1”,“ radius”:40 ......
因此,要获取节点,您需要调用getJSONObject("node")
。