【问题标题】:Consuming JSON with an array in ExpressJS在 ExpressJS 中使用带有数组的 JSON
【发布时间】:2014-12-19 15:22:27
【问题描述】:

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

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

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

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

我正在使用 ExpressJS(与 body-parser 中间件连接)在 NodeJS webapp 中使用这个 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 那样访问它并每次都获取一个数组?

【问题讨论】:

  • hmmm...这听起来根本不对...req.body.okayAnimals 不应该是undefined 给定 json 字符串。
  • 您确定data 是json(字符串)而不是对象吗?事实上,我很肯定它是一个对象而不是一个字符串,因为这解释了你所看到的行为。如果它是一个对象,它就会变成表单参数:favoriteAnimal=piglet&okayAnimals[]=cats&okayAnimals[]=dogs
  • typeof(data) 返回一个 object 所以你是对的,它不是一个字符串

标签: javascript jquery node.js express


【解决方案1】:

Kevin 的回答几乎让我明白了。

$.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"]}

【讨论】:

  • 感谢发帖!在过去的一个小时里,我一直在寻找解决同样问题的方法。我想不出正确的 Google 条款。现在我了解到我习惯于将字符串数据作为对象/json 传递,我忘记了它们不是同一个东西(或上下文,或其他什么)。
【解决方案2】:

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

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

这当然解释了为什么 okAnimals[] 属性存在于主体上。

令我惊讶的是,您用于解析正文的中间件没有正确提取它,但无论如何,如果您想按原样发送它,您应该将 json 字符串传递给 $.post

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

【讨论】:

    猜你喜欢
    • 2019-02-21
    • 2019-03-16
    • 2014-05-12
    • 1970-01-01
    • 2023-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    相关资源
    最近更新 更多