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
相关推荐
lf13210276 小时前
用 JSON Schema 管装修节点记录:从照片台账到可校验工程数据
网络·数据库·人工智能·经验分享·物联网·json·智能家居
丰锋ff11 小时前
7.2Qt中Json的操作
开发语言·qt·json
bugcome_com21 小时前
JWT 知识小课堂:从入门到精通,一文吃透 JSON Web Token
前端·json
ccino .1 天前
awvs_json_word.py 使用说明手册
json·word
richard_yuu1 天前
JSON vs XML vs 二进制:3种序列化终极选型
xml·c++·qt·学习·json
用户7783366132112 天前
SERP 返回 JSON 用 Pydantic 强校验:类型安全解析
json
灵析表格2 天前
灵析表格财务函数深度实用性分析与实操教程
开发语言·ai·json·excel·wps
青 春 记 忆2 天前
零基础入门python07:让程序记住数据——JSON文件和异常处理
开发语言·windows·python·json·python3.11
2603_965148113 天前
如何解析JSON数据?API返回的商品信息处理教程
开发语言·数据库·python·自动化·json·api
鬼手点金3 天前
Scrapy 网络爬虫框架
爬虫·python·scrapy·ajax·html·json·requsts