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=’
为什么会这样。。。
当然可以!你遇到的问题是因为 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
*/
解释
-
递归函数
flatten
:- 这个函数用于处理嵌套对象,并将其转换为查询字符串的形式。
- 如果当前属性是一个对象,则递归调用
flatten
函数。 - 否则,将属性名和值编码后添加到结果字符串中。
-
调用
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);
解释:
flattenObject
函数:递归地遍历对象,将对象扁平化成键值对的形式。prefix
参数:用于构建嵌套对象的键名。- 递归处理:如果当前值是对象,则继续递归处理;如果是数组,则遍历每个元素并递归处理。
- 编码:使用
encodeURIComponent
对值进行 URL 编码。 - 结果拼接:将所有键值对用
&
连接起来。
运行上述代码后,post_data
将会包含正确格式化的查询字符串。