Javascript 将字符串转换为JSON对象数组-NOdejs
假设我正在向/api/products发送POST请求。我的身体像下面Javascript 将字符串转换为JSON对象数组-NOdejs,javascript,node.js,arrays,json,Javascript,Node.js,Arrays,Json,假设我正在向/api/products发送POST请求。我的身体像下面 { "products":[ { "id":"5f5065e44a12bd00232bcc6g", "status":"true" }, {
{
"products":[
{
"id":"5f5065e44a12bd00232bcc6g",
"status":"true"
},
{
"id":"5f5065e44a12bd00232bcc6g",
"status":"true"
}
]
}
在我的路线中,我试图将上述产品转换为JSON对象
下面是我的服务器代码
const { products } = req.body;
console.log(JSON.parse(products));
但这给了我一个错误“消息”:“JSON中的位置1出现了意外的标记o”
我怎样才能做到这一点
干杯
添加了截图
下面也试过了。但是没有运气
什么都不管用
const products = req.body;
console.dir(typeof products); // 'object'
console.dir(products); // { products: '[object Object]' }
const { products } = req.body;
console.dir(typeof products); // 'string'
console.dir(products); // '[object Object]'
postman开发者控制台如下所示。这似乎不是个问题
{
"products":[
{
"id":"5f5065e44a12bd00232bcc6g",
"status":"true"
},
{
"id":"5f5065e44a12bd00232bcc6g",
"status":"true"
}
]
}
尝试使用JSON.stringify()
否则,可能您正在声明一个对象(const{products}),请尝试不使用{}查看变量
products
的内容以及调试器
在这一行中,您使用的是对象分解赋值,但右侧不是对象,而是字符串:
const { products } = req.body;
请尝试以下方法:
const { products } = JSON.parse(req.body);
编辑您似乎正在使用Express中间件或类似工具。您的对象很可能已经从JSON转换而来,因此您只需要原始行,而不是JSON.parse
行
const { products } = req.body;
console.dir(products);
最好的办法是通过在
{}
周围放置{}
来修复发送到/api/products
的内容,如下所示:
{
"products":[
{
"id":"5f5065e44a12bd00232bcc6g",
"status":"true"
},
{
"id":"5f5065e44a12bd00232bcc6g",
"status":"true"
}
]
}
const obj = JSON.parse("{" + req.body + "}");
console.log(obj);
const { products } = obj;
现在它是有效的JSON,您可以通过JSON.parse
转换它:
const obj = JSON.parse(req.body);
console.log(obj);
const { products } = obj;
或者只是
const { products } = JSON.parse(req.body);
const { products } = JSON.parse("{" + req.body + "}");
注意,我用的是整个身体。这将为您提供一个具有属性(products
)和产品数组的对象。或者,您可以使用中间件来自动解析,而不是手动解析,这样,req.body
就是解析的结果,在这种情况下,它只是:
console.log(req.body);
const { products } = req.body;
如果由于某种原因,您无法发送正确的JSON,但它将始终以您所显示的形式发送,您可以在之后添加
{}
,如下所示:
{
"products":[
{
"id":"5f5065e44a12bd00232bcc6g",
"status":"true"
},
{
"id":"5f5065e44a12bd00232bcc6g",
"status":"true"
}
]
}
const obj = JSON.parse("{" + req.body + "}");
console.log(obj);
const { products } = obj;
或者只是
const { products } = JSON.parse(req.body);
const { products } = JSON.parse("{" + req.body + "}");
但我强烈建议不要这样做,尤其是因为您不能使用中间件,发送格式错误的数据往往不理想。相反,首先发送有效的JSON。它不是JSON对象,JSON对象被大括号包围 如果你回来
{“产品”:[{“id”:“5f5065e44a12bd00232bcc6g”,“状态”:“true”},{“id”:“5f5065e44a12bd00232bcc6g”,“状态”:“true”}
然后它就会工作了。把它弄明白了
多亏了@T.j和@Alnitak,我们才得以将其分类。使用
let obj = req.body;
但我的验证器有问题
body('products')
.trim()
.not()
.isEmpty()
.withMessage('Custom product must have a main product'),
在上面的代码中,使用.trim()将产品转换为字符串,删除trim()后,它将正常工作。谢谢大家的想法如果这是你的主体,它不是有效的JSON——你不能在对象之外有属性键。(这是正文吗?)“在我的路线中,我试图将上述产品转换为JSON对象”;JSON是用于数据交换的文本符号。如果您处理的是JavaScript源代码,而不是字符串,那么就不是JSON。听起来好像你在试图将一个包含JSON的字符串转换成一个对象(不是JSON对象,只是一个对象)。。。冗余。这似乎更符合正确的轨道,但需要注意的是,它并不是100%清楚主体中到底有什么。@DaveNewton是的-主体确实应该有
{..}
围绕它,我已经从主体中添加了json中间件-parser@ShankaSomasiri是的,所以您不需要自己解析JSON.parse
body!我尝试了你所有的建议。但它们都不起作用。我做了req.body的console.log,它显示在下面{product:'[object]}。我仍然想知道为什么这不起作用,因为听起来客户端代码没有发送您在问题中输入的内容。具体来说,客户端代码听起来像是在手动创建JSON字符串(这不是一个好主意),并使用字符串连接(+
)和对象。当您这样做时,对象将转换为“[对象对象]”
,并添加到字符串中。在这种情况下,您认为T.J.的最佳方式是什么?我还添加了一些屏幕截图,是否有可能某些中间件已经在从JSON转换正文?使用console.dir
而不是console.log
将揭示这一点。@Alnitak-确实如此。调试器也是如此。