Jersey Restful WebService 接收 JSON 数组 对象
在使用 jersey restful 时 前端ajax post 数据到 服务器端,接收对象为null,测试代码 web: var ts = []; //模拟两条数据 for (var i = 0; i < 2; i++) { ts.push({name:'name'+i,id:i}); } var testData = {aa:ts}; printLog('log',testData); $.rate.post({ url: hostUrl + '/xxx/xxx/xxxx/queryDepartmentsAll',data:testData,cache: false,objRest:false,success: function(data) { console.log(data); } }); post data: --- log --- {"aa":[{"name":"name0","id":0},{"name":"name1","id":1}]} server: /** * 查询所有科室 * @return * @throws Exception */ @POST @Path("/queryDepartmentsAll") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_FORM_URLENCODED) public String queryDepartmentsAllTest(@Form(prefix="aa")List<TestBean> beans) throws Exception { loggin.info(beans); return "test..."; } TestBean: @XmlRootElement public class TestBean { @FormParam("name") private String name; @FormParam("id") private Integer id; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } } 有请?"debug "?出场....... ?ajax发出请求后 会经过 HttpServletInputMessage 处理,获取表单带的参数 调用getDecodedFormParameters,会把 url中的参数和表单参数合并,放入MultivaluedMapImpl 对象中 MultivaluedMapImpl点toString - -->?{aa[1][id]=[1],aa[0][name]=[name0],aa[0][id]=[0],aa[1][name]=[name1]} 往下走,到了ListFormInjector form 注入器有两种,List,Map 最终走到了PrefixedMultivaluedMap 类 对象注入的方式是通过“变量[0].属性” 注入的,而前段传进的值是 解决办法: 把花括号改成“ .” 就可以注入了 修改后: aa[0].id=0 aa[0].name=name0 aa[1].id=1 aa[1].name=name1 后端接收到了 ==================================================================== jquery ajax data 如果对象中包涵数组,是使用?jQuery.param 函数格式化,所以导致 传输的数据格式不正确 jQuery.param = function( a,traditional ) { var prefix,s = [],add = function( key,value ) { // If value is a function,invoke it and return its value value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value ); s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value ); }; // Set traditional to true for jQuery <= 1.3.2 behavior. if ( traditional === undefined ) { traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional; } // If an array was passed in,assume that it is an array of form elements. if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { // Serialize the form elements jQuery.each( a,function() { add( this.name,this.value ); }); } else { // If traditional,encode the "old" way (the way 1.3.2 or older // did it),otherwise encode params recursively. for ( prefix in a ) { buildParams( prefix,a[ prefix ],traditional,add ); } } // Return the resulting serialization return s.join( "&" ).replace( r20,"+" ); }; 可以在请求前把data类型先处理,demo js var datas = {}; for (var a in settings.data) { if ($.isArray(settings.data[a])) { var isObject = $.isPlainObject(settings.data[a][0]); //如果数组里是对象 if (isObject) { for (var i = 0,ds = settings.data[a],len = ds.length; i < len; ++i) { for (var b in ds[i]) { datas[a + '[' + i + '].' + b] = ds[i][b]; } } } } else {// datas[a] = settings.data[a]; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 使用docker监控器登录到stdout
- 使用Axis编写WebService
- VMware虚拟机从一个分区转移复制到另一个分区
- 批处理文件 – 什么是bash的set -e的cmd.exe替代品?
- angularjs – controller:ctrlfmt糟糕的控制器字符串”.必
- scala – 部分应用类型参数
- bootstrap3使用bootstrap datetimepicker日期插件
- 【AngularJS】2.AngularJS依赖注入中代码压缩的问题
- angularjs – 在深窝json上使用ng-repeat
- bootstrap-datetimepicker can't work with fontawesom