0

客户端通过 HTTP PUT 向我发送 JSON 文件,文件如下:

    {
    "nomPers": "Testworking",
    "prenomPers": "WorkingTest",
    "loginPers": "Work",
    "pwdPers": "Ing",
    "active": true
    },

我使用 HTTPServlet 作为 WebService 框架和 org.json 库来处理 Json。我也在使用 Tomcat 服务器。由于 Tomcat 无法为此 HTTP 动词创建参数映射,因此我必须使用 JSON 对象。

所以我做了一些搜索和尝试,但仍然无法使其工作,这是我的代码:

    @Override
public void doPut(HttpServletRequest request, HttpServletResponse response) {

    // this parses the incoming json to a json object.
    JSONObject jObj = new JSONObject(request.getParameter("jsondata"));

    Iterator<String> it = jObj.keys();

    while(it.hasNext())
    {
        String key = it.next(); // get key
        Object o = jObj.get(key); // get value
        System.out.println(key + " : " +  o); // print the key and value
    }

因此,我将传入的 Json 解析为要使用的 Json 对象,然后创建一个 Iterator 以便能够遍历该对象并获取和打印每个键/值对的数据。

问题是我收到 NullPointerException 错误。

我猜是因为 request.getParameter("jsondata")。看来我没有得到任何参数。我想我必须从通过请求获得的数据创建一个字符串来提供 JSONObject 构造函数,但我不知道如何实现这一点。

4

3 回答 3

3

我认为客户端在请求正文中向您发送 JSON 数据,而不是在参数中。因此,您尝试解析为 JSON 数据的参数将始终为null. 要完成您的任务,您首先要获取正文请求,然后将其解析为 JSON。例如,您可以使用以下方法将正文转换为字符串:

public static String getBody(HttpServletRequest request)  {

    String body = null;
    StringBuilder stringBuilder = new StringBuilder();
    BufferedReader bufferedReader = null;

    try {
        InputStream inputStream = request.getInputStream();
        if (inputStream != null) {
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            char[] charBuffer = new char[128];
            int bytesRead = -1;
            while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                stringBuilder.append(charBuffer, 0, bytesRead);
            }
        } else {
            stringBuilder.append("");
        }
    } catch (IOException ex) {
        // throw ex;
        return "";
    } finally {
        if (bufferedReader != null) {
            try {
                bufferedReader.close();
            } catch (IOException ex) {

            }
        }
    }

    body = stringBuilder.toString();
    return body;
}

因此,您的方法将变为:

@Override
public void doPut(HttpServletRequest request, HttpServletResponse response) {
  // this parses the incoming JSON from the body.
  JSONObject jObj = new JSONObject(getBody(request));

  Iterator<String> it = jObj.keys();

  while(it.hasNext())
  {
    String key = it.next(); // get key
    Object o = jObj.get(key); // get value
    System.out.println(key + " : " +  o); // print the key and value
  }
  ...
于 2018-10-12T05:15:12.280 回答
1

因此,显然您的客户端正在发送 json 字符串作为请求正文,因此您在从 request.getParameter("jsondata") 获取它时得到了 null。

在这种情况下,您需要从 request.getInputStream() 中选择请求正文数据,因此您更新的方法应该是这样的,

@Override
public void doPut(HttpServletRequest request, HttpServletResponse response) {
    String jsonBody = new BufferedReader(new InputStreamReader(request.getInputStream())).lines().collect(
            Collectors.joining("\n"));
    if (jsonBody == null || jsonBody.trim().length() == 0) {
        // return error that jsonBody is empty
    }

    // this parses the incoming json to a json object.
    JSONObject jObj = new JSONObject(jsonBody);

    Iterator<String> it = jObj.keys();

    while (it.hasNext()) {
        String key = it.next(); // get key
        Object o = jObj.get(key); // get value
        System.out.println(key + " : " + o); // print the key and value
    }
}

希望这可以帮助。

于 2018-10-12T10:30:17.040 回答
0

使用下面的解析器和 JsonObject 来获取 JsonObject 形式的数据。

这些类在 gson-2.8.5.jar 中可用,导入这个 jar 然后使用gson 库。

JsonParser parser = new JsonParser();
JsonObject o = parser.parse(request.getParameter("jsondata"));

您可以从 JsonObject 获取 keySet,然后使用 Iterator 对其进行迭代。

希望对你有帮助!

于 2018-10-12T04:54:57.283 回答