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 コードは、ネットワーク内に含まれるノードの配列であり、各ノード オブジェクトには String nodeID、3 つの Float 変数、次に atom と呼ばれるオブジェクトが含まれます。このアトムには、float の 2 つの文字列と、linkTo および linkFrom と呼ばれる 2 つの配列が含まれます。これらには、リンクを表すオブジェクトが含まれます (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");
    .....

簡単なものが欠けているだけだと思いますが、これを微調整しようとして1週間近く費やしましたが、どこにも行きません!

for ループ内の println(node) ステートメントがノードを正確に出力するため、ノードが適切にロードされていることがわかります。動作していないように見えるノード ID を取得しようとしているだけです。順序を変更して x または y float を取得しようとしても、エラーが発生します。

ありがとう。

4

1 に答える 1

6

私のコメントが言うように、

に置き換えるnode.getString("nodeID");node.getJSONObject("node").getString("nodeID");問題が解決するはずです。

これは getJSONArray()、角括弧内にすべての JSON オブジェクトが含まれているためです。node.getString("nodeID");実際にはJSONObjectの下にあり、

{"node":{"nodeID": "1","radius": 40. .....

したがって、ノードを取得するには、 を呼び出す必要がありますgetJSONObject("node")

于 2013-07-30T06:51:43.327 に答える