我在使用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")

10-08 13:31