当前位置: 首页 > 面试题库 >

解析Java Servlet中包含数组的JSON对象的正确方法(例如,使用Gson)

殳经略
2023-03-14
问题内容

我知道这是一个经常被谈论的话题,但是我仍然无法找到针对我的特定问题的正确清晰的答案。

我有一个看起来像这样的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: {arbitraryNameHere: JSON.stringify(myData)}

这会将您的“ myData”对象作为JSON发布在名为“ arbitraryNameHere”的参数中。



 类似资料:
  • 我从accuweather获得了以下带有json的代码 我尝试通过Jackson将此对象解析为POJO 我有json中指定的所有模型,如、数组、,由组成(在json中命名为最小值和最大值)等,它们都有私有字段和公共构造函数、getter和setter。但是我没有一些字段,因为我想省略它们(Day、night、EpochDate、Source)。 当我运行程序时,我得到了错误 com.fasterx

  • GSON不是在一开始就解析我传递的整个JSON字符串吗?因此,最终,我希望新的数据源是对象。那可行吗?

  • 问题内容: 我试图从JSON数组中获取每个JSON对象。我通过HTTP发布获得此数据。 我知道我的数据是什么样的: 我的示例代码和结构如下所示: 我不确定如何遍历JSON数组并获取JSON对象,然后仅使用JSON对象。 问题答案: 试试这个作为您的结构, 您的名称不正确,顶层名称也不正确。解码为a之后,您可以遍历切片以获取每个切片

  • 我希望在每个数组中获取多个对象,但我的代码显示了单个对象的操作。下面是我的PHP代码,我如何添加另一个循环来获取多个对象 这是显示单个物体的结果

  • 问题内容: 我有一个JSON,它可以是单个对象或相同对象的数组。有没有一种方法可以使用Gson解析此数据,从而区分单个对象还是数组? 我目前唯一的解决方案是手动解析json并用try catch包围它。首先,我将尝试将其解析为单个对象,如果失败,它将引发异常,然后尝试将其解析为数组。 我不想手动解析它……那将使我永远。这是正在发生的事情的想法。 这是可以是数组或单个对象的对象。 然后在与json响

  • 问题内容: 我想知道如何解析NodeJS中的JSON对象数组? 我想将JSON数组发布到服务器,并能够将接收到的数组用作可靠的JavaScript数组。 提前致谢。 这是我要使用stringify函数将Array转换为String的前端部分 这是我尝试将JSON对象的Array转换为Array的后端部分 这是我要发送到服务器的数组: 这是源代码 问题答案: 在您的: 然后,您可以使用来获取过帐的值