Tõn*_*ool 6 java json servlets gson
我知道这是一个备受关注的话题,但我仍然无法找到对我具体问题的正确而明确的答案.
我有一个看起来像这样的JSON:
var myData = { "gameID" : gameID,
"nrOfPlayers" : 2,
"playerUIDs" : [123, 124]
};
Run Code Online (Sandbox Code Playgroud)
我所拥有的问题正是在Java servlet中解析它的正确方法(或最好的方式,样式方式)(例如使用GSON)?首先,我使用jQuery ajax方法将此JSON发送到服务器,如下所示:
jQuery.ajax({
url : path,
data : myData,
success : successFunction,
error : function(data) {
console.log("Error: ", data);
} ,
type : "post",
timeout : 30000
});
Run Code Online (Sandbox Code Playgroud)
现在在servlet中我了解到我应该能够像这样解析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]);
}
Run Code Online (Sandbox Code Playgroud)
但是playerUIDs变量是IS NULL,当然playerUIDs [0]会引发异常!
深入挖掘我发现当循环遍历请求参数名称时,它包含一个名为"playerUIDs []"的参数,其值仅为123(数组中的第一个int).这很奇怪,因为我似乎根本无法访问下一个值.
然后我读到在POST之前应该对JSON对象进行字符串化,所以我添加了JSON.stringify(myData),但是现在请求参数名称只包含一个名称,它是处于字符串化状态的JSON对象本身:
INFO: Parameter name = {"gameID":"b6a51aabb8364b04bce676eafde1bc87","nrOfPlayers":2,"playerUIDs":[123,124]}
Run Code Online (Sandbox Code Playgroud)
我似乎让这个工作的唯一方法是创建一个内部类:
class GameStart {
protected String gameID;
protected int nrOfPlayers;
protected int[] playerUIDs;
}
Run Code Online (Sandbox Code Playgroud)
并从请求参数名称解析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]);
}
Run Code Online (Sandbox Code Playgroud)
现在所有的值都存在,但这看起来更像是一个hack(从请求参数名称读取JSON)而不是优雅的解决方案,所以我想我会问你们这样做的"正确"方法究竟是什么?我错过了一些明显的东西吗
提前致谢!
您不是使用JSON将数据发送到服务器:
data : myData,
Run Code Online (Sandbox Code Playgroud)
这将参数指定为JavaScript对象,但不一定是JSON.这意味着如果您使用以下命令执行GET请求:
data: {name1: "value1", name2: "value2"}
Run Code Online (Sandbox Code Playgroud)
请求将是:
http://some/page?name1=value1&name2=value2
Run Code Online (Sandbox Code Playgroud)
这基本上就是您在第一次调用时看到的内容,其中所有内容都转换为字符串,然后作为表单参数发送.
你在第二个版本中所做的几乎就是你应该做的.唯一的区别是您需要使用JavaScript对象作为参数data,而不仅仅是字符串:
data: {arbitraryNameHere: JSON.stringify(myData)}
Run Code Online (Sandbox Code Playgroud)
这将在名为"arbitraryNameHere"的参数中将您的"myData"对象发布为JSON.