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