Js把Js序列化为urlencoded的方法,Java接受复杂对象。

服务器端

Java定义

 data class role(var name: String = "", var remark: String = "")
 data class user(var name: String = "", var roles: Array<role> = arrayOf())
 data class corp(var name: String = "", var users: Array<user> = arrayOf());

 @PostMapping(value = "hi")
 fun hiPost(qm: corp, session: HttpSession): String {}

Java接受的格式,Kotlin Test

    @Test
    fun testHi() {
        var map = JsonMap();
        map["name"] = "金维度";
        map["users[0].name"] = "张三";
        map["users[0].roles[0].name"] = "销售";
        map["users[0].roles[0].remark"] = "销售角色";
        map["users[0].f"] = "王大,王二";

        map["users[1].name"] = "本四";
        map["users[1].roles[0].name"] = "开发";
        map["users[1].roles[0].remark"] = "开发角色";
        map["users[1].roles[1].name"] = "UI";
        map["users[1].roles[1].remark"] = "设计师";
//        map["createAt"] = 1492762310797;

        var result = mvc!!.perform(
                MockMvcRequestBuilders.post("/hi")
                        .contentType(MediaType.APPLICATION_FORM_URLENCODED_VALUE)
                        .content(URLEncodedUtils.format(map.ToNameValuePairs(), Charset.defaultCharset()))
        )
                .andDo(MockMvcResultHandlers.print())
                .andReturn();

        Assert.assertEquals(result.response.status, 200);
        println(result);
    }

客户端需要PostBody内容:

 name=%E9%87%91%E7%BB%B4%E5%BA%A6&users%5B0%5D.name=%E5%BC%A0%E4%B8%89&users%5B0%5D.roles%5B0%5D.name=%E9%94%80%E5%94%AE&users%5B0%5D.roles%5B0%5D.remark=%E9%94%80%E5%94%AE%E8%A7%92%E8%89%B2&users%5B1%5D.name=%E6%9C%AC%E5%9B%9B&users%5B1%5D.roles%5B0%5D.name=%E5%BC%80%E5%8F%91&users%5B1%5D.roles%5B0%5D.remark=%E5%BC%80%E5%8F%91%E8%A7%92%E8%89%B2&users%5B1%5D.roles%5B1%5D.name=UI&users%5B1%5D.roles%5B1%5D.remark=%E8%AE%BE%E8%AE%A1%E5%B8%88

客户端

定义:

/**Java方式的序列化。
 * @param obj
 */
jv.param_jmap = function (obj) {
  var ret = {};
  Object.keys(obj).forEach(key => {
    var value = obj[key]; 

    if (Array.isArray(value)) {
      for (var i in value) {
        var m = jv.param_jmap(value[i]);
        Object.keys(m).forEach(sk => {
          ret[key + "[" + i + "]." + sk] = m[sk];
        })
      }
    }
    else if (jv.isPlainObject(value)) {
      var m = jv.param_jmap(value);
      Object.keys(m).forEach(sk => {
        ret[key + "." + sk] = m[sk];
      })
    }
    else {
      ret[key] = value;
    }
  })

  return ret;
}

jv.param = function (obj) {
  var ret = jv.param_jmap(obj);
  console.log(ret);
  return Object.keys(ret).map(it => {
    return encodeURIComponent(it) + "=" + encodeURIComponent(ret[it])
  }).join("&");
}

测试:

var data =
    {name:"金维度",users:
      [
        {name:"张三",roles:[{name:"销售",remark:"销售角色"}]},
        {name:"本四",roles:[{name:"开发",remark:"开发角色"},{name:"UI",remark:"设计师"}]}
      ]
    }

var url = jv.param(data);
时间: 2024-08-06 14:19:58

Js把Js序列化为urlencoded的方法,Java接受复杂对象。的相关文章

js注意点:数组比较大小方法及数组与对象的区别

(迁移自旧博客2017-04-19) 快速复制数组及数组比较大小方法 首先介绍一下复制数组的方法: var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G']; var aCopy = arr.slice(); aCopy; // ['A', 'B', 'C', 'D', 'E', 'F', 'G']; 这样就成功复制数组了,是不是很神奇? slice()就是对应String的substring()版本,它截取Array的部分元素,然后返回一个新的Array: v

js apply/call/caller/callee/bind使用方法与区别分析

一.call 方法 调用一个对象的一个方法,以另一个对象替换当前对象(其实就是更改对象的内部指针,即改变对象的this指向的内容). Js代码 call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 参数 thisObj 可选项.将被用作当前对象的对象. arg1, arg2, , argN 可选项.将被传递方法参数序列. 说明 call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对

js经验点滴js apply/call/caller/callee/bind使用方法与区别分析

一.call 方法 调用一个对象的一个方法,以另一个对象替换当前对象(其实就是更改对象的内部指针,即改变对象的this指向的内容). Js代码 call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 参数 thisObj 可选项.将被用作当前对象的对象. arg1, arg2, , argN 可选项.将被传递方法参数序列. 说明 call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对

js oop中的三种继承方法

JS OOP 中的三种继承方法: 很多读者关于js opp的继承比较模糊,本文总结了oop中的三种继承方法,以助于读者进行区分. <继承使用一个子类继承另一个父类,子类可以自动拥有父类的属性和方法.(继承的两方,发生在两个类之间)> 一.通过object实现继承 1:定义父类 function Parent(){} 2:定义子类 funtion Son(){} 3:通过原型给Object对象添加一个扩展方法. Object.prototype.customExtend = function(p

js中test,exec和match方法

js中test,exec和match方法 转载▼ 标签: 杂谈 分类: jsp test test 返回 Boolean,查找对应的字符串中是否存在模式. var str = "1a1b1c";var reg = new RegExp("1.", "");alert(reg.test(str)); // true exec exec 查找并返回当前的匹配结果,并以数组的形式返回. var str = "1a1b1c";var

js中数组去重的几种方法

js中数组去重的几种方法         1.遍历数组,一一比较,比较到相同的就删除后面的                 function unique(arr){                         for(var i=0;i<arr.length;i++){                                 for(var j=i+1;j<arr.length;j++){                                         if(ar

js中style.display=&quot;&quot;无效的解决方法

本文实例讲述了js中style.display=""无效的解决方法.分享给大家供大家参考.具体解决方法如下: 一.问题描述: 在js中我们有时想动态的控制一个div显示或隐藏或更多的操作,但如果我们style.display=""可能导致没有效果. 看下面一段代码: 复制代码代码如下: <style> #name {     display:none; }</style></head><body><div id=

Js中Date格式化为字符串

惭愧,混迹博客园2年了,还没写过什么.最近不太忙,就写一下Js中Date对象的字符串转换吧. 直接贴代码,欢迎各位拍砖,吐槽! /*格式化时间 *formatStr 格式,如:YY-MM-DD hh:mm:ss.Y-M-D h:m:s *只有一个M时,月份小于十时前面不追加零,D.h.m.s雷同 */Date.prototype.toStringFormat = function (formatStr) { if (formatStr == null || formatStr == '') re

js 判断js函数、变量是否存在 JS保存和删除cookie操作,判断cookie是否存在的方法

//是否存在指定函数 function isExitsFunction(funcName) {    try {        if (typeof(eval(funcName)) == "function") {            return true;        }    } catch(e) {}    return false;}//是否存在指定变量 function isExitsVariable(variableName) {    try {        if