Java JSON Object not found

Alex picture Alex · Jul 23, 2013 · Viewed 29.5k times · Source

I'm having some trouble with JSON and Java, I have a working function to export a data strucutre into JSON and save it in a file. But when I try to do the reverse and import the data strucutre back into java, I get an error, the output of which is:

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

From that error I take that the String 'nodeID' can't be found within the node, but it is in the JSON output, which looks like this:

{"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
    }]
    },
 .....

The JSON code is an array of nodes contained within network, then each node object contains a String nodeID, and 3 Float variables, then an Object called atom. This atom then contains two Strings, a float, and 2 arrays called linkTo and linkFrom, which contain objects to represent a link (atomID and delay, string and float respectfully)

And the Java code to load each node from the network looks like this:

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");
    .....

I'm sure I'm just missing something simple, but I've spent nearly a week trying to tweak this and getting nowhere!

I know the node is loading properly, because a println(node) statement inside the for loop prints out the node exactly as it should, it's just trying to fetch the nodeID that seems to not work. Even if I change the order and try to fetch the x, or y float that causes the error too.

Thanks.

Answer

Shashank Kadne picture Shashank Kadne · Jul 30, 2013

As my comment says,

Replacing node.getString("nodeID"); with node.getJSONObject("node").getString("nodeID"); should solve the problem.

This is because getJSONArray() gives you all the JSON objects within the square brackets. node.getString("nodeID"); actually gives below JSONObject,

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

Thus to get node, you need to call getJSONObject("node").