2

我有一个非常独特的问题,我正在尝试解决:

我有以下序列化查询字符串:

a=a2&b.c=c2&b.d.e=e2&b.d.f=f2

反序列化为如下object对象:

{
    a: "a2", 
    b.c: "c2", 
    b.d.e: "e2", 
    b.d.f: "f2"
}

使用以下解析器(在平面对象上效果很好!)

function parse(string){
    string = 
    '{"' +  //root
        string
            .replace(/&/g, '","') //replace '&' with ','
            .replace(/=/g,'":"')+ //replace '=' with ':'\
    '"}'; //close root


return JSON.parse(string,function(key, value){ //handle URI issues

        var ret;

        if(key===""){ //null key means that we have something wrong with the encoding, probably escaped shit
            ret = value;
        }
        else{
            ret = decodeURIComponent(value); //decode escaped stuff
        }
        return ret;

});

}

这需要解析成一个多维对象,表示.键中的符号,如下所示:

{
    a:"a2",
    b:{
        c: "c2",
        d:{
            e:"e2",
            f:"f2"
        }
    }
}

这里的任何帮助都会很棒。在过去的几个小时里,我一直在尝试将其递归到形状中,但是我的大脑已经崩溃,解决方案没有乐趣可言。

如果有另一种方法可以将第 N 维 javascript 对象解析为 URI,然后再解析为 JavaSCript 对象(两个函数),我会全力以赴。

4

2 回答 2

1

您可以序列化您的 javascript 对象并对其进行 URL 编码,请参阅类似问题的答案:Standardized way to serialize JSON to query string?

于 2013-09-06T07:32:20.400 回答
0

我在野外遇到了同样的问题。这是我想出的:

const queryToObject = (query) => {

    return query.split('&').reduce((result, entry) => {
        const [k, v] = entry.split('=')
        const keys = k.split('.')
        let key = 'result', value = `'${v}'`
        for (i = 0; i < keys.length; i++) {
            key += `['${keys[i]}']`
            if (i == keys.length - 1) eval(key + '=' + value)
            else if (!eval(key)) eval(key + '= {}')
        }
        return result
    }, {})

}

const recursiveQueryToObject = (query) => {

    const helper = (keys, value, nth) => {
        const key = keys.shift()
        if (!keys.length) return { [key]: value }
        else return { [key]: { ...nth[key], ...helper(keys, value, nth[key] || {}) } }
    }

    return query.split('&').reduce((result, entry) => {
        const [k, value] = entry.split('=')
        const keys = k.split('.')
        const key = keys.shift()
        result[key] = keys.length ? { ...result[key], ...helper(keys, value, result[key] || {}) } : value
        return result
    }, {})

}
于 2021-03-24T22:17:57.323 回答