JSON对象参数转URL参数

起源,axios GET请求默认不能随着 body 携带 JSON 参数 (尽管 JetBrains HTTP Client 本身是支持 GET 请求发送 JSON 的)

javascript 复制代码
function ObjectToUrlParams(json = {}) {
  const entries = []
  for (const [k, v] of Object.entries(json)) {  // 遍历键值对
    if (Array.isArray(v)) {  // 值是一个数组
      const newKey = k + '[]'  // 键改为 [] 结尾
      v.forEach(function(el) {
        let o = {}
        o[newKey] = el
        entries.push(...ObjectToUrlParams(o))
      })
    } else if (typeof v === 'object') {  // 值是一个对象
      for (const [k2, v2] of Object.entries(v)) { // 对象的某个键对应的值仍可能是对象或数组
        const newKey = k+ "[" + k2 + "]"
        if (Array.isArray(v2)) {  // 二级值是数组
          const newSubKey = newKey + '[]'
          v2.forEach(function(elem) {   // 对数组每个元素
            let o = {}
            o[newSubKey] = elem
            entries.push(...ObjectToUrlParams(o))  // 递归获取后添加
          })
        } else if (typeof v2 === 'object') { // 二级值还是对象,递归获取值后添加
          entries.push(...ObjectToUrlParams({newKey: v2}))
        } else {
          let o = {}
          o[newKey] = v2
          // console.log("Add: ", o)
          entries.push(o)
        }
      }
    } else  {  // 值不是对象,也不是数组
      let o = {}
      o[k] = v
      // console.log("Add: ", o)
      entries.push(o)
    }
  }
  return entries;
}

function paramsArrayToString(paramsArray) {
  let a = []
  for (const kv of paramsArray) {
    for (const [k, v] of Object.entries(kv)) {
      a.push(k + '=' + v)
    }
  }
  return a.join('&')
}

const json = {
  k1: 'kk1',
  k2: [
    111, 222, 333
  ],
  k3: {
    k31: 'kk31',
    k32: 'kk32',
  },
  k4: [
    {k41: 444, k42: 445},
    {k43: 'hello', k44: 'world'}
  ],
  k5: {
    k51: [7, 8, 9]
  }
}

console.log(paramsArrayToString(ObjectToUrlParams(json)));

输出

bash 复制代码
PS C:\Users\sjg20\AppData\Roaming\JetBrains\GoLand2026.1\scratches> node .\scratch.js
Add:  { k1: 'kk1' }
Add:  { 'k2[]': 111 }
Add:  { 'k2[]': 222 }
Add:  { 'k2[]': 333 }
Add:  { 'k3[k31]': 'kk31' }
Add:  { 'k3[k32]': 'kk32' }
Add:  { 'k4[][k41]': 444 }
Add:  { 'k4[][k42]': 445 }
Add:  { 'k4[][k43]': 'hello' }
Add:  { 'k4[][k44]': 'world' }
Add:  { 'k5[k51][]': 7 }
Add:  { 'k5[k51][]': 8 }
Add:  { 'k5[k51][]': 9 }
k1=kk1&k2[]=111&k2[]=222&k2[]=333&k3[k31]=kk31&k3[k32]=kk32&k4[][k41]=444&k4[][k42]=445&k4[][k43]=hello&k4[][k44]=world&k5[k51][]=7&k5[k51][]=8&k5[k51][]=9
相关推荐
阿钱真强道1 小时前
21 嵌入式操作系统 | JSON 与 json-c:生成与解析
c语言·开发语言·json·json-c
譕痕6 天前
JSONObject与JSONArray封装数据格式区别
java·json
A黄俊辉A6 天前
uniapp webview中实现 app和内嵌的H5双向通信
vue.js·json
伞伞悦读6 天前
【第37期】Python JSON 与配置详解:序列化、反序列化、嵌套结构和配置文件
开发语言·python·json
Mikko76 天前
jackson-databind 升到 2.21.6 就安全了吗?jackson-core 是另一个坐标,它那条 high 全局库至今没收
java·后端·安全·json
天若有情6738 天前
独立开发复盘:我用 Node.js 做了个在线工具箱
前端·json·工具
Asurplus9 天前
【SpringBoot4】3、从SpringBoot4升级Sa-Token1.46.0报错
redis·sa-token·json·jackson·springboot4
代码中介商9 天前
C++ 预约系统实战(三):服务端实现——libevent 事件驱动与业务路由
c++·json·c/s
譕痕10 天前
notepad++安装插件 可视化展示 json串内容
json·intellij-idea
databook10 天前
DuckDB + SQL 高效分析 JSON 数据
数据分析·json·nosql