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
相关推荐
牛油果子哥q3 小时前
C++对接LLM完整工程:异步HTTP请求、JSON解析、超时容错、重连兜底
c++·http·json
小刘在重生~4 小时前
Django|Ajax 入门、JSON 返回、ECharts 图表、文件上传完整笔记
ajax·django·json
谢斯2 天前
[unity]如何在unity中添加newtonsoft-json
unity·json·游戏引擎
2601_962066933 天前
短视频批量制作怎么做?2026年用 huasheng-cli 的 --json 与退出码,一张选题表批量出片
json·音视频
oliver_sys_log4 天前
老项目 json-lib 2.4 JSONTokener 精度丢失问题排查
json
IT_Octopus4 天前
JSON 日志里的 `{“$ref“:“$.xxx“}`:从 fastjson 兼容包到原生 fastjson2 的迁移实录
开发语言·python·json
数据狐(Datafox)4 天前
mercadolibre.item_get 工程实战:美客多商品详情API技术解析与落地应用
java·人工智能·mysql·json
Fcy6484 天前
Linux下 应⽤层⾃定义协议与序列化(JSON方法)
linux·json
半亩码田5 天前
C#转Python第4.4篇:JSON 处理:json 模块 vs System.Text.Json
python·c#·json
清水白石0086 天前
Python 类型设计深度解析:TypedDict 能否替代 dataclass?从 JSON 数据边界到 API 设计的最佳实践
java·python·json