如何在 JavaScript 中将 URL 参数转换为 JSON?


在处理 URL 时,您经常会遇到添加额外信息到基本 URL 的查询参数,这对于开发人员来说可能很有帮助,特别是当他们需要将这些 URL 参数转换为 JSON 格式时,尤其是在读取和转换数据方面。在这里,我们将探讨在 JavaScript 中将 URL 参数转换为 JSON 格式的不同方法,包括内置方法和使用分割、归纳、正则表达式的自定义解决方案。

了解 URL 参数

URL 参数位于 URL 中的问号 (?) 字符之后,每个键值对用 & 分隔,这是一个示例 URL。

https://example.com/page?name=Pankaj&age=20&city=Surat

在这个 URL 中,**name=Pankaj、age=20 和 city=Surat** 是查询参数。

将 URL 参数转换为 JSON 的方法

使用 URLSearchParams

URLSearchParams 接口提供用于处理查询参数的方法,这是一种解析 URL 参数的简单有效的方法。

语法

const params = new URLSearchParams(url.search);
let jsonObj = {};
params.forEach((value, key) => {
    jsonObj[key] = value;
});

示例

在这个示例中,我们使用 URLSearchParams 从 URL 访问每个查询参数,通过使用 .forEach 循环遍历参数,我们用键和值填充 jsonObj。

function parseQueryString(url) {
    if (!url) return {};

    const queryString = url.split('?')[1];
    if (!queryString) return {};

    return queryString.split('&')
        .filter(param => param) 
        .reduce((acc, param) => {
    
            const [key, value = ''] = param.split('=');
            try {
                acc[decodeURIComponent(key)] = decodeURIComponent(value);
            } catch (e) {
                console.warn(`Failed to decode query parameter: ${param}`);
            }
            
            return acc;
        }, {});
}
const url = 'https://example.com/page?name=Pankaj&age=20&city=Surat';
console.log(parseQueryString(url));

输出

{
  "name": "Pankaj",
  "age": "20",
  "city": "Surat"
}

使用 split 和 reduce 方法

为了获得更多控制,您可以使用 split 方法分割参数并使用 reduce 方法构建 JSON 对象。

语法

const queryString = url.split('?')[1];
const jsonObj = queryString.split('&').reduce((acc, param) => {
    const [key, value] = param.split('=');
    acc[key] = decodeURIComponent(value);
    return acc;
}, {});

示例

在这里,split 方法将查询字符串从 URL 中分离出来,然后我们用 & 分隔每个键值对,并使用 reduce 方法迭代这些对,构造 jsonObj,每个参数用 split('=') 分割成键和值,然后赋值给 jsonObj,输出的 JSON 对象与 URL 中的参数匹配。

function urlParamsToJson(url) {
    const queryString = url.split('?')[1];
    const jsonObj = queryString.split('&').reduce((acc, param) => {
        const [key, value] = param.split('=');
        acc[key] = decodeURIComponent(value);
        return acc;
    }, {});
    return jsonObj;
}
const url = 'https://example.com/page?name=Pankaj&age=20&city=Surat';
console.log(urlParamsToJson(url));

输出

{
  "name": "Pankaj",
  "age": "20",
  "city": "Surat"
}

使用正则表达式

对于熟悉正则表达式的人来说,这种方法可以通过定位特定模式来帮助解析复杂的 URL 字符串。

语法

const regex = /[?&]([^=#]+)=([^&#]*)/g;
let jsonObj = {};
let match;
while ((match = regex.exec(url))) {
    jsonObj[match[1]] = decodeURIComponent(match[2]);
}

示例

在这个示例中,我们使用正则表达式匹配 URL 中的每个搜索参数,正则表达式获取以 ? 开头并以 & 结尾的键值对,并将其赋值给 jsonObj,decodeURIComponent 函数可以确保正确解码编码的字符,最终的 JSON 对象正确地反映了 URL 参数。

function urlParamsToJson(url) {
    const regex = /[?&]([^=#]+)=([^&#]*)/g;
    let jsonObj = {};
    let match;
    while ((match = regex.exec(url))) {
        jsonObj[match[1]] = decodeURIComponent(match[2]);
    }
    return jsonObj;
}
const url = 'https://example.com/page?name=Pankaj&age=20&city=Surat';
console.log(urlParamsToJson(url));

输出

{
  "name": "Pankaj",
  "age": "20",
  "city": "Surat"
}

处理极端情况

  • **空参数:**如果 URL 没有参数 (https://example.com/page),则每种方法都应该理想地返回一个空对象 {}。
  • const url = 'https://example.com/page';
    // Expected output: {}
    console.log(urlParamsToJson(url)); 
    
  • **重复键:**如果 URL 包含重复键(例如 ?name=Pankaj&name=Neeraj),则只保留最后一个键值对,要存储所有值,请考虑将重复项存储为数组。

  • 示例修改
    function urlParamsToJson(url) {
        const params = new URLSearchParams(url.split('?')[1]);
        let jsonObj = {};
        params.forEach((value, key) => {
            if (jsonObj[key]) {
                jsonObj[key] = [].concat(jsonObj[key], value);
            } else {
                jsonObj[key] = value;
            }
        });
        return jsonObj;
    }
    

更新于:2024年11月5日

56 次浏览

启动您的 职业生涯

完成课程获得认证

开始学习
广告