从 HttpServletRequest 检索 JSON 对象文字

Posted

技术标签:

【中文标题】从 HttpServletRequest 检索 JSON 对象文字【英文标题】:Retrieving JSON Object Literal from HttpServletRequest 【发布时间】:2010-12-05 15:33:16 【问题描述】:

我正在编写需要提取发布到 servlet 的对象文字的代码。我研究了 HttpServletRequest 对象的 API,但我不清楚如何从请求中获取 JSON 对象,因为它不是从网页上的表单元素发布的。

感谢任何见解。

谢谢。

【问题讨论】:

您的问题令人困惑。如果不是表单,请显示导致某些内容被 POST 到 servlet 的 javascript 代码(或任何可能的代码)。如果您正在寻找一些内置的 J2EE 方法来理解 JSON 对象文字,那么没有。 您的问题是您试图从浏览器向servlet发送一个json对象,却无法获取servlet上的信息吗? 查看更多热门***.com/questions/3831680/… 【参考方案1】:

你在找这个吗?

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException 
    StringBuilder sb = new StringBuilder();
    BufferedReader reader = request.getReader();
    try 
        String line;
        while ((line = reader.readLine()) != null) 
            sb.append(line).append('\n');
        
     finally 
        reader.close();
    
    System.out.println(sb.toString());

【讨论】:

这个方法确实将json表示转换为字符串,但我认为这可能不是处理json数据的最佳方式。【参考方案2】:

如果您尝试从请求正文中获取数据,则上面的代码可以正常工作。但是,我认为您遇到了与我相同的问题..

如果正文中的数据是 JSON 格式,并且您希望它作为 Java 对象,您需要自己解析它,或者使用像 google-gson 这样的库来为您处理它。您应该查看项目网站上的文档和示例以了解如何使用它。这很简单。

【讨论】:

【参考方案3】:

使用 google-gson 将检索到的数据从请求对象转换为 json 对象如下

Gson gson = new Gson();
ABCClass c1 = gson.fromJson(data, ABCClass.class);

//ABC class is a class whose strcuture matches to the data variable retrieved

【讨论】:

你测试过这个吗?它不起作用。 java.lang.IllegalArgumentException:“HttpServletRequest”类声明了多个名为“logger”的 JSON 字段。【参考方案4】:

最简单的方法是从 Reader 对象填充您的 bean,这可以在一次调用中完成:

BufferedReader reader = request.getReader();
Gson gson = new Gson();

MyBean myBean = gson.fromJson(reader, MyBean.class);

【讨论】:

【参考方案5】:

利用杰克逊 JSON 处理器

 ObjectMapper mapper = new ObjectMapper();
  Book book = mapper.readValue(request.getInputStream(),Book.class);

【讨论】:

这太完美了!你摇滚! @Clyde D'Cruz 如何在使用 HttpExchange 时使用它..??【参考方案6】:

还有另一种方法,使用org.apache.commons.io.IOUtils从请求中提取字符串

String jsonString = IOUtils.toString(request.getInputStream());

然后你可以为所欲为,将其转换为JSON或其他带有Gson的对象等

JSONObject json = new JSONObject(jsonString);
MyObject myObject = new Gson().fromJson(jsonString, MyObject.class);

【讨论】:

【参考方案7】:

这是从HttpServletRequest获取请求数据的简单方法 使用 Java 8 流 API

String requestData = request.getReader().lines().collect(Collectors.joining());

【讨论】:

这值得更多关注!我认为最简单的解决方案。 我在拨打getReader() 时收到java.lang.IllegalStateException: STREAMED。有什么建议吗? 从内部org.eclipse.jetty.server.Request

以上是关于从 HttpServletRequest 检索 JSON 对象文字的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 303 区域和检索 - 数组不可变

如何向我的 Java Servlet 的现有 HttpServletRequest 添加参数?

303. 区域和检索 - 数组不可变

从 HttpServletRequest 获取 POST 请求正文

303-区域和检索 - 数组可修改

如何从 HttpServletRequest 获取完整的 url? [复制]