我有
@RequestMapping(method = RequestMethod.GET) @ResponseBody SessionInfo register(UserProfile profileJson){ ... }
我以这种方式传递profileJson:
http://server/url?profileJson={"email": "mymail@gmail.com"}
但是我的profileJson对象具有所有空字段。我应该怎么做才能使spring解析我的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){ ... }
现在为答案。假设你有一个类似于以下内容的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. }