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 天前
【高速缓存】RedisVL 存储类型选择指南:Hash 与 JSON
人工智能·redis·算法·缓存·json·哈希算法
减瓦1 天前
Jackson 使用指南
java·spring boot·json
制造数据与AI践行者老蒋2 天前
离谱!PromptTemplate 遇上 JSON,花括号直接引发解析战争
数据库·microsoft·json
chenjingming6662 天前
JWT(JSON Web Token)有效期查看登录过期时间
json
绘梨衣的sakura路2 天前
Fastjson ≤ 1.2.83 新型 RCE 漏洞深度分析:三层绕过机制与完整利用链
安全·web安全·json
江湖十年3 天前
Go 语言中 YAML to JSON 踩坑笔记
后端·go·json
前网易架构师-高司机3 天前
带标注的扑克牌识别数据集,识别率99.5%,3083张图,支持yolo,coco json,voc xml,文末有模型训练代码
xml·yolo·json·数据集·数字·扑克牌·纸牌
前网易架构师-高司机3 天前
带标注的浮游藻类24种数据集,识别率91.5 %数据集, 23175张图,支持yolo,coco json,voc xml,文末有模型训练代码
yolo·json·数据集·微观·生物·浮游·藻类
维天说4 天前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
一颗小行星-5 天前
为什么有的JSON可以带注释?
json