Я знаю, что это тема, о которой много говорят, но я так и не смог найти правильный и понятный ответ на мою конкретную проблему.
У меня есть 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 из имени параметра запроса), чем на элегантное решение, поэтому я подумал Я хотел бы спросить вас, ребята, что именно было бы «правильным» способом сделать это? Я упускаю что-то очевидное?
Заранее спасибо!