从Java Servlet中的传入JSON获取数据

时间:2018-10-12 04:12:20

标签: java json web-services

客户端通过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构造函数的数据创建一个字符串,但是我不知道如何实现这一点。

3 个答案:

答案 0 :(得分:2)

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

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
  }
  ...

答案 1 :(得分: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
    }
}

希望这会有所帮助。

答案 2 :(得分:0)

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

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

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

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

希望这对您有帮助!