Как читать json с несколькими массивами в контроллере spring mvc?

Я отправляю json из ajax в контроллер, содержащий несколько массивов.

Json-данные:

{
    "node": [
        {
            "id": "dev_1",
            "blockId": "11"
        },
        {
            "id": "dev_2",
            "blockId": "15"
        }
    ],
    "connect": [
        {
            "id": "con_5",
            "typeId": "2"
        }
    ],
    "name": "test"
}

Контроллер:

@RequestMapping(value = "/saveBoard", method = RequestMethod.POST)
    public JsonResponse saveBoard(@RequestBody String jsonData) throws IOException {
        JsonResponse response = new JsonResponse();
        ObjectMapper mapper = new ObjectMapper();
        final JsonNode jsonNode = mapper.readTree(jsonData).get("node");

        if(jsonNode.isArray()) {
            for (final JsonNode nodes : jsonNode) {
                System.out.println("jsonNode : "+ nodes);
            }
        }
        return response;
    }

Я пробовал с картографом объектов, но не удалось. Здесь я хочу прочитать другой массив для разных классов, таких как узел для класса узла с некоторыми указанными полями, подключиться для класса подключения и строки для другого использования.

ОБНОВЛЕНИЕ Контроллер:

@RequestMapping(value = "/saveBoard", method = RequestMethod.POST)
    public JsonResponse saveMissionBoard(@RequestBody MissionJsonPojo chartJson) {
        boolean status = false;
        String messsage = "";
        JsonResponse response = new JsonResponse();
        System.out.println("data : " + flowChartJson.getNodes());        
        return response;
    }

Аякс:

 $.ajax({
          url: '<c:url value="/board/saveBoard"/>',
          type: 'POST',
          data: JSON.stringify(chartJson),
          dataType: "json",
          contentType: "application/json",
          success: function(response) {
            console.log("In success");
          },
          error: function (a, b, c) {  }
        });

JSON:

{
    "nodes": [
        {
            "missionDeviceId": "device_1",
            "device": "1",
            "deviceXCoordinate": 79,
            "deviceYCoordinate": 73,
            "blockId": "1##1"
        },
        {
            "missionDeviceId": "device_2",
            "device": "3",
            "deviceXCoordinate": 340,
            "deviceYCoordinate": 146,
            "blockId": "2##5"
        }
    ],
    "connections": [
        {
            "missionConnectionId": "con_5",
            "sourceId": "device_1",
            "targetId": "device_2",
            "device": "2"
        }
    ],
    "name": "test"
}

Узел Pojo:

public class Nodes{
    private String missionDeviceId;
    private Integer device;
    private String deviceXCoordinate;
    private String deviceYCoordinate;
    private String blockId; //getters setters
}

Соединение Pojo:

public class Connections{    
    private String missionConnectionId;
    private String sourceId;
    private String targetId;
    private Integer device; //getters and setters
}

МиссияДжонПойо:

public class MissionJsonPojo{
    private List<Nodes> nodes;
    private List<Connections> connections;
    private String name; //getters and setters
}

person Jennifer    schedule 27.04.2016    source источник
comment
Что является исключением?   -  person asg    schedule 27.04.2016
comment
почему бы не создать bean-компонент для объекта json?   -  person Hadi J    schedule 27.04.2016
comment
@asg Прости за это. Я обновил вопрос.   -  person Jennifer    schedule 27.04.2016
comment
Создайте POJO, соответствующий заданному json, т.е. с двумя списками объектов (предпочтительно тот, который представляет connect и node) и строку   -  person dambros    schedule 27.04.2016
comment
@dambros, не могли бы вы дать мне представление о том, как я буду обрабатывать данные json с помощью этого pojo?   -  person Jennifer    schedule 27.04.2016
comment
какую библиотеку вы используете   -  person Abhishek    schedule 27.04.2016
comment
@Abhishek Это Джексон для json   -  person Jennifer    schedule 27.04.2016


Ответы (1)


Как предложил @dambros, создайте структуру POJO следующим образом:

public class Node {
    private String id;
    private String blockId;
    //setter-getters.
}

public class Connect {
    private String id;
    private String typeId;
    //setter-getters.
}

import java.util.List;

public class Payload {
    private List<Node> nodes;
    private List<Connect> connects;
    private String name;
    //setter-getters
}

И измените подпись метода на:

public JsonResponse saveBoard(@RequestBody Payload payload) throws IOException {

}

Это должно решить вашу проблему.

person asg    schedule 27.04.2016
comment
позвольте мне попробовать это. - person Jennifer; 27.04.2016
comment
Это должно получиться сделано. Просто получите этот POJO в качестве параметра вашего контроллера. - person dambros; 27.04.2016
comment
Это дает: исключение однострочного конструктора/фабричного метода - person Jennifer; 28.04.2016
comment
Пожалуйста, добавьте полную основную причину. - person asg; 28.04.2016
comment
Взгляните на - stackoverflow.com/questions/8369260/ - person asg; 28.04.2016
comment
Когда запрос приходит к контроллеру, он выдает следующее исключение: вложенное исключение: com.fasterxml.jackson.databind.JsonMappingException: невозможно создать экземпляр значения типа - person Jennifer; 28.04.2016
comment
@asg Я обновил свой вопрос с помощью контроллера и запроса ajax, пожалуйста, посмотрите - person Jennifer; 28.04.2016
comment
@Jennifer Это может быть проблема с JSON, который вы отправляете на контроллер. Не могли бы вы вставить - chartJson? - person asg; 28.04.2016
comment
Давайте продолжим обсуждение в чате. - person Jennifer; 28.04.2016