在ExpressJS中使用带有数组的JSON

Consuming JSON with an array in ExpressJS

本文关键字:数组 JSON ExpressJS      更新时间:2023-09-26

在网页上,我正在使用jQuery:发布一些JSON

$.post('/url', data);

我的数据是一个javascript对象,其中包含一些值和一个数组。JSON.stringify(data)看起来像:

{"favoriteAnimal":"piglet", "okayAnimals":["cats","dogs"]} 

我正在使用ExpressJS(与主体解析器中间件连接)在NodeJS Web应用程序中使用这个JSON。我可以检索到像req.body.favoriteAnimal这样的最喜欢的动物,它给了我字符串piglet,这一切都很好。

但是我如何访问数组中的值呢?

req.body.favoriteAnimal // piglet
req.body.okayAnimals // undefined
req.body.okayAnimals[] // syntax error

这很有效。。。

req.body['okayAnimals[]']

但是闻起来有腥味。如果要POST的原始数据的数组中只包含一个元素(它只返回一个字符串),它也不会返回数组。

是JSON的jQuery编码发生了什么问题,还是ExpressJS中的解码发生了什么事情,使我无法像req.body.okayAnimals一样访问它,每次都无法获得数组?

凯文的回答几乎让我如愿以偿。

$.post('/url', JSON.stringify(data))将发送一个更近一步的字符串。不幸的是,jQuery的$.post设置了错误的头

Content-Type:application/x-www-form-urlencoded; charset=UTF-8

ExpressJS的主体解析器将无法正确处理。你最终得到

req.body={"{'"favoriteAnimal'":'"piglet'",'"okayAnimals'":['"cats'",'"dogs'"]}":""}

我重写了发送数据的方式。

$.ajax({
  url: '/url',
  type: 'POST',
  data: data,
  contentType: 'application/json; charset=utf-8',
  dataType: 'json'
})

我看到我的浏览器正在发送正确的标题

Content-Type:application/json; charset=UTF-8

并观察到

req.body={"favoriteAnimal":"piglet","okayAnimals":["cats","dogs"]}

JavaScript对象和JSON是两个非常不同的东西,这是您看到的问题的根源。传递给$.post()的实际上是一个对象,而不是json,因此在发送到节点之前,jQuery会将其转换为paramstring。在这种情况下,paramstring是:

favoriteAnimal=piglet&okayAnimals[]=cats&okayAnimals[]=dogs

这当然解释了为什么CCD_ 8特性存在于身体上。

我很惊讶你用来解析正文的中间件没有正确地接收到它,但不管怎样,如果你想按原样发送,你应该向$.post传递一个json字符串。

$.post('/url', JSON.stringify(data));