Nodejs新人请教关于querystring.stringify()的问题。

Nodejs新人请教关于querystring.stringify()的问题。

直接发代码。 var dataobj = { button:[ { type:“click”, name:“今日歌曲”, key:“V1001_TODAY_MUSIC” }, { type:“click”, name:“歌手简介”, key:“V1001_TODAY_SINGER” }, { name:“菜单”, sub_button: [ { type:“click”, name:“hello word”, key:“V1001_HELLO_WORLD” }, { type:“click”, name:“赞一下我们”, key:“V1001_GOOD” } ] } ] }

var post_data = querystring.stringify(dataobj); console.log(post_data); =>结果输出’button=&button=&button=’

为什么会这样。。。


6 回复

当然可以!你遇到的问题是因为 dataobj 中的结构比较复杂,而 querystring.stringify() 方法不能很好地处理嵌套的对象。让我们一步一步来解决这个问题。

首先,我们需要确保 dataobj 能够被正确地转换成一个查询字符串。你可以使用递归函数来处理嵌套对象的情况。下面是一个示例代码,展示了如何将复杂的 dataobj 转换成正确的查询字符串。

const querystring = require('querystring');

// 复杂的数据对象
var dataobj = {
    button: [
        {
            type: "click",
            name: "今日歌曲",
            key: "V1001_TODAY_MUSIC"
        },
        {
            type: "click",
            name: "歌手简介",
            key: "V1001_TODAY_SINGER"
        },
        {
            name: "菜单",
            sub_button: [
                {
                    type: "click",
                    name: "hello word",
                    key: "V1001_HELLO_WORLD"
                },
                {
                    type: "click",
                    name: "赞一下我们",
                    key: "V1001_GOOD"
                }
            ]
        }
    ]
};

// 递归函数处理嵌套对象
function flatten(obj, prefix) {
    let str = [];
    for (let p in obj) {
        let k = prefix ? `${prefix}[${p}]` : p;
        if (typeof obj[p] === 'object' && obj[p] !== null) {
            str.push(flatten(obj[p], k));
        } else {
            str.push(`${k}=${encodeURIComponent(obj[p])}`);
        }
    }
    return str.join('&');
}

// 将数据对象转换为查询字符串
var post_data = flatten(dataobj, 'button');
console.log(post_data);

// 输出结果
/*
button[0][type]=click&button[0][name]=%E4%BB%8A%E6%97%A5%E6%AD%8C%E6%9B%B2&button[0][key]=V1001_TODAY_MUSIC&button[1][type]=click&button[1][name]=%E6%AD%8C%E6%89%8B%E7%AE%80%E4%BB%8B&button[1][key]=V1001_TODAY_SINGER&button[2][name]=%E8%8F%9C%E5%8D%95&button[2][sub_button][0][type]=click&button[2][sub_button][0][name]=hello+word&button[2][sub_button][0][key]=V1001_HELLO_WORLD&button[2][sub_button][1][type]=click&button[2][sub_button][1][name]=%E8%B5%A0%E4%B8%80%E4%B8%8B%E6%88%91%E4%BB%AC&button[2][sub_button][1][key]=V1001_GOOD
*/

解释

  1. 递归函数 flatten

    • 这个函数用于处理嵌套对象,并将其转换为查询字符串的形式。
    • 如果当前属性是一个对象,则递归调用 flatten 函数。
    • 否则,将属性名和值编码后添加到结果字符串中。
  2. 调用 flatten 函数

    • 我们传递 dataobj 和前缀 'button'flatten 函数,以生成所需的查询字符串。

通过这种方式,我们可以将复杂的对象结构转换为标准的查询字符串格式。希望这能解决你的问题!


是这样对了

LZ应该想用JSON.stringify(dataobj);吧!

用 qs 模块,别用原生的。

npm install qs

或者试试支持 gbk 等各种编码的 urlencode 模块

你的问题在于 dataobj 对象的结构比较复杂,并且包含了嵌套的对象和数组。querystring.stringify() 方法默认处理扁平的对象结构,对于复杂的对象结构,你需要自定义转换逻辑。

你可以使用递归函数来处理复杂的对象结构。以下是一个示例代码:

const querystring = require('querystring');

var dataobj = {
    button: [
        {
            type: "click",
            name: "今日歌曲",
            key: "V1001_TODAY_MUSIC"
        },
        {
            type: "click",
            name: "歌手简介",
            key: "V1001_TODAY_SINGER"
        },
        {
            name: "菜单",
            sub_button: [
                {
                    type: "click",
                    name: "hello word",
                    key: "V1001_HELLO_WORLD"
                },
                {
                    type: "click",
                    name: "赞一下我们",
                    key: "V1001_GOOD"
                }
            ]
        }
    ]
};

function flattenObject(obj, prefix) {
    let result = [];
    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            let newKey = prefix ? `${prefix}[${key}]` : key;
            if (typeof obj[key] === 'object' && !Array.isArray(obj[key])) {
                result = result.concat(flattenObject(obj[key], newKey));
            } else if (Array.isArray(obj[key])) {
                for (let i = 0; i < obj[key].length; i++) {
                    result = result.concat(flattenObject(obj[key][i], `${newKey}[${i}]`));
                }
            } else {
                result.push(`${newKey}=${encodeURIComponent(obj[key])}`);
            }
        }
    }
    return result;
}

var post_data = flattenObject(dataobj).join('&');
console.log(post_data);

解释:

  1. flattenObject 函数:递归地遍历对象,将对象扁平化成键值对的形式。
  2. prefix 参数:用于构建嵌套对象的键名。
  3. 递归处理:如果当前值是对象,则继续递归处理;如果是数组,则遍历每个元素并递归处理。
  4. 编码:使用 encodeURIComponent 对值进行 URL 编码。
  5. 结果拼接:将所有键值对用 & 连接起来。

运行上述代码后,post_data 将会包含正确格式化的查询字符串。

回到顶部