AngularJS:$resource期望接收数组反序列化,实际获对象的转换方法
解决AngularJS $resource保存数据为数组格式的问题
核心思路:将单个对象包装为数组并正确序列化
后端期望接收数组格式的数据,你当前传递的是单个对象或URL编码字符串,可根据后端接收格式选择以下方案:
场景1:后端接收JSON格式的数组
直接在$resource服务中统一处理请求体,将单个对象包装为数组并序列化为JSON:
修改你的PessoasSrv服务,为save和update方法添加请求转换逻辑:
pessoas.factory("PessoasSrv", function ($http, $resource) { var baseUrl = "http://localhost/sisgestorv2/"; return $resource( baseUrl + "contato/:id", { id: "@id", }, { query: { method: "GET", isArray: true, }, update: { method: "PUT", url: baseUrl + "contato/update/:id", transformRequest: function(data) { // 将单个对象包装为数组后序列化为JSON return angular.toJson([data]); }, headers: {'Content-Type': 'application/json'} }, save: { method: "POST", transformRequest: function(data) { return angular.toJson([data]); }, headers: {'Content-Type': 'application/json'} }, remove: { method: "DELETE", url: baseUrl + "contato/delete/:id", }, } ); })
transformRequest:AngularJS请求转换钩子,自动将传入的单个对象包装为数组,再用angular.toJson()序列化为JSON字符串(比原生JSON.stringify更适配AngularJS对象)。headers:明确告知后端请求体为JSON格式,避免默认的form-data编码。
场景2:后端接收URL编码的数组(如nome[]=xxx格式)
如果后端期望form-data格式的数组参数,使用jQuery.param时需添加traditional: true参数:
var arrayData = [item]; var encodedStr = jQuery.param(arrayData, true);
这会生成类似nome[]=angularjs&telefone[]=%2B556639687898的URL编码字符串,符合后端对数组格式的解析要求。
关于JSON.parse()无效的说明
JSON.parse()的作用是将JSON字符串解析为对象/数组,而你当前需要的是将对象转换为数组并序列化为字符串,因此使用angular.toJson()或JSON.stringify()才是正确方向。
内容的提问来源于stack exchange,提问作者Braga
相关产品推荐
相关产品推荐

