如何处理 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
最简单的解决方案可能是执行以下操作
- 将输入流转换为字符串
- 使用构造函数用字符串填充JSON数组
- 遍历数组
- 对于每次交互,从数组的迭代中获取 JSON对象
- 从当前对象中抓取成员的值
您还可以使用 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.json
和 org.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 将标签 属性 的值视为数字
我有一个基于 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
最简单的解决方案可能是执行以下操作
- 将输入流转换为字符串
- 使用构造函数用字符串填充JSON数组
- 遍历数组
- 对于每次交互,从数组的迭代中获取 JSON对象
- 从当前对象中抓取成员的值
您还可以使用 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.json
和 org.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 将标签 属性 的值视为数字