Hi,
我们知道可以在Controller中使用@RequestBody 注解自动装配对象获得前台POST过来的JSON字符串,但是现在我想直接获取一个json字符串应该如何获取?
如:有JSON字符串{"code":"abc"} 我想直接获取code的值但是不装配成对象该怎么办?
Controller代码如下:
@RequestMapping(value = "/isExistByCode", method = RequestMethod.POST) public boolean isExistByCode(@RequestBody String code) { return abilityService.isExistByCode(code); }
使用如下单元测试方法报错
@Test public void testIsExistByCode() throws Exception { String jsonStr = "{\"code\":\"465\"}"; mockMvc.perform(post("/ability/isExistByCode").contentType(MediaType.APPLICATION_JSON).content(jsonStr)).andExpect(status().isOk()).andDo(print()); }
15,130 [main] INFO c.n.core.log.LogExceptionHandler - requestBody={"code":"aaa465"} 2014-07-23 21:12:15,135 [main] ERROR c.n.core.log.LogExceptionHandler - exception trace org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Can not deserialize instance of java.lang.String out of START_OBJECT token
1.如上面一哥们说的,但是不建议使用
2.直接将requestcontent转换为JSONObject(配置Converter,springmvc会帮我们做)
method(@RequestBodyJSONObjectjsonObj){jsonObj.getString("code");}
实现方式:
@JsonArg("$.resource")Stringcode步骤:
1、自定义注解
@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.PARAMETER)public@interfaceJsonArg{publicStringvalue()default"";}@RequestParam(value="code")Stringcode
即可获取到
绝逼获取不到这样获取不到吧IOUtils.toString(request.getInputStream())请求包的contentType要设置成multipart/form-data,这样Servlet容器才不会解析请求包体
另外这个东西和Spring的multipart文件上传组件冲突
这样的:
@RequestMapping(value="reset_passwd.json",method=RequestMethod.POST)@ResponseBodypublicObjectresetPasswd(@RequestBodyStringrequestJson){Stringmessage=null;Map<String,Object>jsonData=StringUtils.parseJson(requestJson);Stringemployee=(String)jsonData.get("employee");//...}而发起这个请求是: /***使用POST模拟文件上传提交一个json对象,注意这个方法提交的数据为json对象的字符串表示而非标准文件上传请求包**@paramurl*@paramparams*@return*@throwsIOException*/publicstaticStringdoJson(Stringurl,Objectdata)throwsIOException{HttpURLConnectionconnection=(HttpURLConnection)newURL(url).openConnection();connection.setDoOutput(true);connection.setConnectTimeout(Const.DEFAULT_HTTP_CONNECT_TIMEOUT);connection.setReadTimeout(Const.DEFAULT_HTTP_READ_TIMEOUT);connection.setUseCaches(false);connection.setRequestMethod("POST");connection.setRequestProperty("Content-Type","multipart/form-data");BufferedOutputStreamout=null;try{out=newBufferedOutputStream(connection.getOutputStream());out.write(StringUtils.toJson(data).getBytes(Const.DEFAULT_CHARSET));out.flush();}finally{if(out!=null){out.close();out=null;}}//...后面读取结果}method(@RequestBodyMapmap){
map.get("code");
}
感谢指点,非常有用,看了下JSON被转成了LinkedHashMap只能用Map或者对象接收回复 @Kent_Chen:记得给最佳哈。谢谢,这个是可以的:)不是method(HttpServletRequestrequest){
request.getParameter("code");
}就好?
@Kent_Chen我一直用的getParameter,是可以取到值的,确定是POST方法POST放在REQUESTBODY里的,getParameter是取不到的有兴趣的可以试一下参数过来是串,想直接用肯定还需要转换?要么自带提供的有,要么自己转可以用post 请求把json数据作为值,例如value=jsondata,这个时候用 getParameter可以取到,剩下的你想怎么转就怎么转,还有一种方法,自定义ConversionService版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。