Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将字符串转换为JSON对象数组-NOdejs_Javascript_Node.js_Arrays_Json - Fatal编程技术网

Javascript 将字符串转换为JSON对象数组-NOdejs

Javascript 将字符串转换为JSON对象数组-NOdejs,javascript,node.js,arrays,json,Javascript,Node.js,Arrays,Json,假设我正在向/api/products发送POST请求。我的身体像下面 { "products":[ { "id":"5f5065e44a12bd00232bcc6g", "status":"true" }, {

假设我正在向/api/products发送POST请求。我的身体像下面

{
      "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-确实如此。调试器也是如此。