悠悠楠杉
网站页面
正文:
在前后端分离架构中,JSON已成为数据交互的主流格式。作为Java开发者,掌握高效接收JSON POST数据的方法至关重要。以下是三种不同技术栈下的实现方案,每种方案均附带完整代码示例。
适用于非Spring项目,通过手动解析HttpServletRequest流实现:
@WebServlet("/api/json")
public class JsonServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
// 1. 获取输入流
BufferedReader reader = req.getReader();
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
// 2. 解析JSON
try {
JSONObject json = new JSONObject(sb.toString());
String username = json.getString("username");
int age = json.getInt("age");
// 业务处理...
} catch (JSONException e) {
resp.setStatus(400);
resp.getWriter().write("Invalid JSON format");
}
}
}
关键点:
- 需手动处理输入流和字符编码
- 推荐使用org.json或Gson等库解析
- 必须关闭流防止资源泄漏
利用@RequestBody注解实现自动反序列化:
@RestController
@RequestMapping("/user")
public class UserController {
@PostMapping("/create")
public ResponseEntity<String> createUser(@RequestBody UserDTO user) {
if(user.getUsername() == null) {
return ResponseEntity.badRequest().body("Username required");
}
// 业务处理...
return ResponseEntity.ok("User created");
}
}
// DTO对象
public class UserDTO {
private String username;
private Integer age;
// getters/setters省略
}
优势:
- 自动类型转换与验证
- 内置Jackson/Gson支持
- 配合@Valid实现参数校验
针对复杂场景的增强处理:
@ControllerAdvice
public class GlobalExceptionHandler {
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(HttpMessageNotReadableException.class)
public ErrorResponse handleJsonParseError() {
return new ErrorResponse("JSON_PARSE_ERROR", "请求体格式错误");
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List> converters) {
converters.add(0, new MappingJackson2HttpMessageConverter(
new ObjectMapper().registerModule(new JavaTimeModule())
));
}
}
@PostMapping("/dynamic")
public void handleDynamicJson(@RequestBody Map payload) {
payload.forEach((k,v) -> System.out.println(k + ":" + v));
}
实际开发中,推荐优先采用Spring Boot方案,其内置的智能转换机制能减少90%的样板代码。遇到特殊格式要求时,可通过自定义HttpMessageConverter实现灵活扩展。