0

我在使用 JSON 和 Java 时遇到了一些问题,我有一个工作函数可以将数据结构导出到 JSON 中并将其保存在文件中。但是当我尝试做相反的事情并将数据结构导入回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 个浮点变量,然后是一个名为 atom 的对象。然后这个原子包含两个字符串、一个浮点数和 2 个名为 linkTo 和 linkFrom 的数组,其中包含表示链接的对象(atomID 和延迟,分别是字符串和浮点数)

从网络加载每个节点的 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 浮点数。

谢谢。

4

1 回答 1

6

正如我的评论所说,

更换应该node.getString("nodeID");可以node.getJSONObject("node").getString("nodeID");解决问题。

这是因为 getJSONArray()在方括号内为您提供了所有 JSON 对象。node.getString("nodeID");实际上给出了下面的 JSONObject,

{“节点”:{“节点ID”:“1”,“半径”:40 .......

因此要获取节点,您需要调用getJSONObject("node").

于 2013-07-30T06:51:43.327 回答