Правильный способ разбора объектов JSON, содержащих массивы, в сервлетах Java (например, с помощью Gson)

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

У меня есть JSON, который выглядит следующим образом:

var myData = {  "gameID" : gameID,
                "nrOfPlayers" : 2,
                "playerUIDs" : [123, 124]
            };

Вопрос, который у меня есть, заключается в том, как правильно (или лучше всего, с точки зрения стиля) анализировать это в сервлете Java (например, с использованием GSON)? Сначала я отправляю этот JSON на сервер, используя метод jQuery ajax следующим образом:

jQuery.ajax({
        url : path,
        data : myData,
        success : successFunction,
        error : function(data) {
            console.log("Error: ", data);
        }  ,
        type : "post",
        timeout : 30000
    });

Теперь в сервлете я узнал, что должен был разобрать этот JSON следующим образом:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Gson gson = new Gson();

        String gameID = gson.fromJson(request.getParameter("gameID"), String.class);
        String nrOfPlayers = gson.fromJson(request.getParameter("nrOfPlayers"), String.class);
        String[] playerUIDs = gson.fromJson(request.getParameter("playerUIDs"), String[].class);

        log.info(gameID);
        log.info(nrOfPlayers);
        log.info(playerUIDs[0] +" "+ playerUIDs[1]);
}

Но переменная playerUIDs IS NULL и Конечно, playerUIDs[0] выдает исключение!

Копнув глубже, я обнаружил, что при циклическом просмотре имен параметров запроса он содержал параметр с именем «playerUIDs[]»со значением только 123(первое целое число в множество). Это было странно, потому что я вообще не мог получить доступ к следующим значениям.

Затем я прочитал, что объекты JSON должны быть преобразованы в строку перед POST-записью, поэтому я добавил JSON.stringify(myData), но теперь имена параметров запроса содержали только ОДНО имя, которое было самим объектом JSON в строковом состоянии:

INFO: Parameter name = {"gameID":"b6a51aabb8364b04bce676eafde1bc87","nrOfPlayers":2,"playerUIDs":[123,124]}

Единственный способ заставить это работать — создать внутренний class:

class GameStart {
    protected String gameID;
    protected int nrOfPlayers;
    protected int[] playerUIDs;
}

И анализ JSON из имени параметра запроса, например:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        Gson gson = new Gson();
        Enumeration en = request.getParameterNames();
        GameStart start = null;
        while (en.hasMoreElements()) {
            start = gson.fromJson((String) en.nextElement(), GameStart.class);
        }
        log.info(start.gameID);
        log.info(String.valueOf(start.nrOfPlayers));
        log.info(start.playerUIDs[0] +" "+ start.playerUIDs[1]);
}

Теперь все значения есть, но это больше похоже на хак (чтение JSON из имени параметра запроса), чем на элегантное решение, поэтому я подумал Я хотел бы спросить вас, ребята, что именно было бы «правильным» способом сделать это? Я упускаю что-то очевидное?

Заранее спасибо!

6
задан Tõnis Pool 22 March 2012 в 20:16
поделиться