0

У меня возникли проблемы с JSON и Java, у меня есть рабочая функция для экспорта данных в JSON и сохранения их в файле. Но когда я пытаюсь сделать обратное и импортировать strucutre данных обратно в Java, я получаю сообщение об ошибке, выход которого является:Java JSON Объект не найден

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 и 2 массива, называемые 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"); 
    ..... 

Я уверен, что я просто отсутствует что-нибудь простое, но я потратил почти неделю, пытаясь настроить это и не к чему!

Я знаю, что узел правильно загружается, потому что оператор println (node) внутри цикла for выдает узел точно так, как должен, он просто пытается получить идентификатор узла, который, похоже, не работает. Даже если я изменю порядок и попытаюсь извлечь x или y float, который также вызывает ошибку.

Спасибо.

+0

Попробуйте заменить 'node.getString (" nodeID ");' с 'node.getJSONObject (" node "). GetString (" nodeID "); ' –

+0

Ahh блестящий, это работает сейчас! Если вы не возражаете, не могли бы вы объяснить, почему вы должны использовать getJSONObject? Поскольку у меня уже есть JSONObject узла, значит, это не так, как сказать node - node - nodeID, если вы понимаете, что я имею в виду? – Alex

+0

'getJSONArray()' предоставит вам все объекты JSON в квадратных скобках. То, что у вас было, было на самом деле JSONObject '{" node ": {" nodeID ":" 1 "," radius ": 40 ...' ... Таким образом, чтобы получить узел, нам пришлось делать 'getJSONObject (« node ») ' –

ответ

3

Как мой комментарий говорит,

Замена node.getString("nodeID"); с node.getJSONObject("node").getString("nodeID"); должны решить эту проблему.

Это потому, что getJSONArray() предоставляет вам все объекты JSON в квадратных скобках. node.getString("nodeID"); на самом деле дает ниже JSONObject,

{ "узел": { "NodeId": "1", "радиус": 40. .....

Таким образом, чтобы получить узел, вам нужно позвонить getJSONObject("node").

Смежные вопросы