我知道这是一个经常被谈论的话题,但是我仍然无法找到针对我的特定问题的正确清晰的答案。
我有一个看起来像这样的JSON:
var myData = { "gameID" : gameID, "nrOfPlayers" : 2, "playerUIDs" : [123, 124] };
我要问的问题是,在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 });
现在,在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]); }
但是playerUIDs变量IS NULL,当然playerUIDs [0]会引发异常!
深入研究发现,在遍历请求参数名称时,它包含一个 名为“ playerUIDs []” 的 参数 ,其 值仅为123 (数组中的第一个int)。这很奇怪,因为我似乎根本无法访问下一个值。
然后我读到JSON对象应该在POST-ing之前进行字符串化,所以我添加了JSON.stringify(myData),但是现在请求参数名称仅 包含一个名称 ,这是处于字符串化状态的JSON对象本身:
INFO: Parameter name = {"gameID":"b6a51aabb8364b04bce676eafde1bc87","nrOfPlayers":2,"playerUIDs":[123,124]}
我似乎要使它起作用的唯一方法是创建一个内部类:
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),而不是一种优雅的解决方案,所以我想我想问问你们,这样做的“正确”方法到底是什么?我缺少明显的东西吗?
提前致谢!
您没有使用JSON将数据发送到服务器:
data : myData,
这将参数指定 为JavaScript对象 ,但不一定指定为JSON。这意味着如果您使用以下命令执行GET请求:
data: {name1: "value1", name2: "value2"}
该请求将是:
http://some/page?name1=value1&name2=value2
这基本上就是您第一次调用时看到的内容,其中所有内容都被转换为字符串,然后作为表单参数发送。
在第二个版本中,您所做的几乎是您应该做的。唯一的区别是您需要使用JavaScript对象作为的参数data,而不仅仅是字符串:
data
data: {arbitraryNameHere: JSON.stringify(myData)}
这会将您的“ myData”对象作为JSON发布在名为“ arbitraryNameHere”的参数中。