如何处理 JSON in POST body HttpServletRequest

How to handle JSON in POST body HttpServletRequest

我有一个基于 servlet 的 REST Java 应用程序,我想像这样管理请求:

curl -X POST -d "[{"label": "001", "value": 12345}, {"label": "002", "value": 54321}]" -H 'Content-Type: application/json' xxx.com/my/endpoint

基本上我发送了一个 JSON 数组,问题是我如何才能正确解析它? 我此刻得到的只是使用类似的东西打印它:

String body = request.getReader().lines().collect(Collectors.joining(System.lineSeparator()));

但我希望能够处理请求中的每一对标签和值。

解决方案org.json和org.apache.commons.io

最简单的解决方案可能是执行以下操作

  1. 将输入流转换为字符串
  2. 使用构造函数用字符串填充JSON数组
  3. 遍历数组
  4. 对于每次交互,从数组的迭代中获取 JSON对象
  5. 从当前对象中抓取成员的值

您还可以使用 JSON 将字符串映射到一组与 JSON 模式匹配的 classes。这更复杂,但它可能是替代解决方案。最大的问题可能是如何将顶级匿名数组映射到 class

String string = IOUtils.toString( request.getInputStream() );
JSONArray jsonArr = new JSONArray( string );
JSONObject object;

for ( int i = 0; i < jsonArr.length(); i++ ) {
    object = jsonArr.getJSONObject( i );
    System.out.println( object.getString("label") );
    System.out.println( object.getInt("value") );
}

您需要将 org.jsonorg.apache.commons.io 依赖项添加到构建路径中。以下是如何通过 Maven

将其添加到您的项目中的示例
<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20210307</version>
</dependency>

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>

Post 脚本

您说此解决方案是从标签 属性 的值中去除前导零。我相信这与您的要求有关,而不是代码示例。尝试转义嵌套双引号或使用单引号

curl -X POST -d '[{"label": "001", "value": 12345}, {"label": "002", "value": 54321}]' -H 'Content-Type: application/json' xxx.com/my/endpoint

我相信嵌套的双引号导致 JSON 将标签 属性 的值视为数字