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
相关推荐
喵喵虫14 小时前
汉字笔顺笔画元数据导出 JSON
小程序·json·元数据·汉字·笔顺·笔画
熊猫钓鱼>_>17 小时前
Kotlin Multiplatform for OpenHarmony 实战:kotlinx-serialization JSON 适配
开发语言·华为·kotlin·华为云·json·harmonyos·code
雪芽蓝域zzs1 天前
json数据转化成interface属性
前端·javascript·json
ha_lydms2 天前
Json Functions(JSON 函数)
大数据·hadoop·spark·json·数据处理·dataworks·maxcompute
BD_Marathon2 天前
JSONLoader加载JSON文件
json
积流成海2 天前
JSON 格式化:语法校验与错误定位实践
json·状态模式·盘子工具站
JavaPub-rodert2 天前
Docker 日志为什么能把磁盘写爆?讲透 json-file、local、journald、日志轮转与 docker logs
docker·eureka·json
voipmaker2 天前
选煤厂智能化:UWB 人员定位系统 WebAPI 对接融合通信平台实战
物联网·实时互动·json·音视频·实时音视频·web·视频
IT_Octopus3 天前
【零基础入门 LLM 开发 · Day 15】:LangChain 注册工具——告别手写 JSON Schema
java·langchain·json