Spring MVC控制器中的JSON参数

我有

@RequestMapping(method = RequestMethod.GET) @ResponseBody SessionInfo register(UserProfile profileJson){ ... } 

我以这种方式传递profileJson:

 http://server/url?profileJson={"email": "mymail@gmail.com"} 

但我的profileJson对象具有所有的空字段。 我应该怎么做才能让springparsing我的json?

这可以使用自定义编辑器来完成,该编辑器将JSON转换为UserProfile对象:

 public class UserProfileEditor extends PropertyEditorSupport { @Override public void setAsText(String text) throws IllegalArgumentException { ObjectMapper mapper = new ObjectMapper(); UserProfile value = null; try { value = new UserProfile(); JsonNode root = mapper.readTree(text); value.setEmail(root.path("email").asText()); } catch (IOException e) { // handle error } setValue(value); } } 

这是为了在控制器类中注册编辑器:

 @InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomEditor(UserProfile.class, new UserProfileEditor()); } 

这是如何使用编辑器来解开JSONP参数:

 @RequestMapping(value = "/jsonp", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE}) @ResponseBody SessionInfo register(@RequestParam("profileJson") UserProfile profileJson){ ... } 

这个解决scheme非常简单,实际上会让你发笑,但在开始之前,我首先要强调的是,没有一个自我尊敬的Java开发人员永远不会这样做,我的意思是,如果不使用jackson的高端性能JSON库。

Jackson不仅是Java开发人员的工作和实际的JSON库,而且还提供了一整套API调用,使JSON与Java集成成为一块蛋糕(您可以在http://jackson.codehaus下载Jackson 。 org / )。

现在回答。 假设你有一个UserProfile pojo,看起来像这样:

 public class UserProfile { private String email; // etc... public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } // more getters and setters... } 

…然后你的Spring MVC方法将JSON值为{“email”:“mymail@gmail.com”}的GET参数名称“profileJson”转换成你的控制器中的这个样子:

 import org.codehaus.jackson.JsonParseException; import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.ObjectMapper; // this is your lifesaver right here //.. your controller class, blah blah blah @RequestMapping(value="/register", method = RequestMethod.GET) public SessionInfo register(@RequestParam("profileJson") String profileJson) throws JsonMappingException, JsonParseException, IOException { // now simply convert your JSON string into your UserProfile POJO // using Jackson's ObjectMapper.readValue() method, whose first // parameter your JSON parameter as String, and the second // parameter is the POJO class. UserProfile profile = new ObjectMapper().readValue(profileJson, UserProfile.class); System.out.println(profile.getEmail()); // rest of your code goes here. } 

巴姆! 你完成了。 我鼓励你看看jacksonAPI的大部分,因为正如我所说,这是一个救星。 例如,你是否从你的控制器返回JSON? 如果是这样,所有你需要做的就是在你的lib中包含JSON,并返回你的POJO和jackson将自动将其转换成JSON。 你不能比这容易得多。 干杯! 🙂

这确实解决了我的直接问题,但我仍然好奇你怎样通过AJAX调用传递多个JSON对象。

做到这一点的最好方法是让一个包装对象包含你想传递的两个(或多个)对象。 然后,将您的JSON对象构造为两个对象的数组,即

 [ { "name" : "object1", "prop1" : "foo", "prop2" : "bar" }, { "name" : "object2", "prop1" : "hello", "prop2" : "world" } ] 

然后在您的控制器方法中,您将请求主体作为单个对象接收,并提取两个包含的对象。 即:

 @RequestMapping(value="/handlePost", method = RequestMethod.POST, consumes = { "application/json" }) public void doPost(@RequestBody WrapperObject wrapperObj) { Object obj1 = wrapperObj.getObj1; Object obj2 = wrapperObj.getObj2; //Do what you want with the objects... } 

包装对象看起来像…

 public class WrapperObject { private Object obj1; private Object obj2; public Object getObj1() { return obj1; } public void setObj1(Object obj1) { this.obj1 = obj1; } public Object getObj2() { return obj2; } public void setObj2(Object obj2) { this.obj2 = obj2; } } 

在这个参数之前添加@RequestBody注解