【问题标题】:Issue with getting a JSON object to work in NodeJS让 JSON 对象在 NodeJS 中工作的问题
【发布时间】:2019-01-27 22:14:38
【问题描述】:

我正在尝试获取一个 JSON 对象,因此为了确保我拥有它,我编写了如下代码:

var payload = JSON.parse(
JSON.stringify(Buffer.from(pubsubMessage.data, 'base64').toString())
);

console.log(payload);
// { timestamp: '1533564208', device_id: '2nd_test', temperature: '20.0' }
console.log(typeof payload);
// string

编辑 - 根据您的反馈,我将进一步详细说明代码和类型。以下是完整代码及其返回的内容:

var payload = Buffer.from(pubsubMessage.data, 'base64').toString();
console.log('payload 0');
console.log(payload);
// { timestamp: "1533564208", device_id: "2nd_test", temperature: "20.0" }
console.log(typeof payload);
//string
var payload2 = JSON.parse(
  Buffer.from(pubsubMessage.data, 'base64').toString()
);
console.log('payload 2');
console.log(payload2);
// SyntaxError: Unexpected token t in JSON at position 2 at JSON.parse

编辑 2 - 为了更好地理解上下文,我将 GCloud 中的函数与 PubSub 触发器一起使用。所以缓冲区中的数据来自pubsub。

我不明白为什么函数 JSON.parse 会崩溃,尽管它显然是字符串中的 JSON 格式。

这有什么线索吗?

谢谢!

【问题讨论】:

  • JSON 是数据的序列化,而不是数据类型本身。它将数据序列化为字符串。
  • 你正在对一个字符串进行字符串化,在你正在解析的字符串中留下引号。因此,当解析 this 时,它不是因为 JSON 对象,因为它们不是键值。它只是变成一个字符串
  • 你可能只需要解析它而不用字符串化它。
  • 我明白你说的,但我直接做 JSON.parse(Buffer.from(pubsubMessage.data, 'base64').toString()) 我得到一个 SyntaxError: Unexpected token t in JSON at JSON.parse () 的第 2 位
  • @fro 那是因为它不是有效的 JSON。

标签: javascript json node.js google-cloud-functions google-cloud-pubsub


【解决方案1】:

发生这种情况是因为您将数据“字符串化”了两次,分别是 .toString()JSON.stringify

// since I dont have your data, I will use this as example
var example = { a : 'a', b : 'b' };
var payload = JSON.parse(JSON.stringify(example.toString()));

// will log [object Object]
console.log(payload);
// will log string
console.log(typeof payload);

因此,当您使用 JSON.parse 反序列化时,它仍然保留为字符串。你只需要序列化一次:

var example = { a : 'a', b : 'b' };
var payload = JSON.parse(JSON.stringify(example));

// will log the object correctly
console.log(payload);
// will log object
console.log(typeof payload);

【讨论】:

  • 感谢您的回答 - 它帮助了我!但是我仍然没有解决我的问题。我添加了一些上下文和编辑以更好地描述问题。
【解决方案2】:

你为什么这样做?

var payload2 = JSON.parse(
  Buffer.from(pubsubMessage.data, 'base64').toString()
);

你可以打印Buffer.from(pubsubMessage.data, 'base64').toString()的结果

【讨论】:

  • 好吧,原因很简单,我需要在此之后将 JSON 发送到 BigQuery,这样做会引发错误,因为我需要有效的 JSON 而不是字符串
  • 如果您将字符串转换为 JSON ,它只会将其用两个双引号括起来。 abc => "abc",所以尝试手动操作
  • 不确定我是否收到您的评论。我在 "{"timestamp":"1533564208","device_id":"2nd_test","temperature":"20.0"}" 上尝试了 JSON.parse,但它也不起作用
  • 除非您转义引号,否则您不能将该字符串传递给JSON.parse。所以无论如何它都行不通。字符串应该是"{\"timestamp\":\"1533564208\",\"device_id\":\"2nd_test\",\"temperature\":\"20.0\"}"'{"timestamp":"1533564208","device_id":"2nd_test","temperature":"20.0"}'
  • 好吧,我明白你的意思了。但是,如何才能将此字符串 { timestamp: "1533564208", device_id: "2nd_test", temperature: "20.0" } 视为 JSON 对象?
【解决方案3】:

这个问题有点令人困惑。 在代码中硬编码以下 2 个版本会给我相同的结果并且工作正常。

payload= { timestamp: "1533564208", device_id: "2nd_test", temperature: "20.0" } 

payload='{"timestamp":"1533564208","device_id":"2nd_test","temperature":"20.0"}'

但在使用 PubSub Gcloud 和 Buffer 功能时,我必须确保传入

payload='{"timestamp":"1533564208","device_id":"2nd_test","temperature":"20.0"}' 

而不是

payload= { timestamp: "1533564208", device_id: "2nd_test", temperature: "20.0" } 

否则它不会认为它是有效的 JSON。

【讨论】:

    猜你喜欢
    • 2018-03-20
    • 2017-05-06
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多