首页 > 解决方案 > 如何将电话号码解析为 JSON

问题描述

主要内容

我收到一个 MQTT 数据包(它以 ASCII 数组的形式出现在缓冲区中 [使用 stringify 打印后]):

packet = {
    "cmd": "publish",
    "retain": true,
    "qos": 1,
    "dup": false,
    "length": 36,
    "topic": "topic/subtopic",
    "payload": {
        "type": "Buffer",
        "data": [123,34,50,57,34,58,43,52,52,55,56,53,49,54,56,53,50,51,52,125]
    },
    "messageId": 3
}

packet.payload转换为{"29":+447...}哪个是手机号码的开头。当传入时JSON.parse(packet.payload),它会抛出SyntaxError: Unexpected token + in JSON at position 6

我的问题是如何提取价值(不太重要的是,关键)?

您可以跳过的额外(可能不必要的)上下文

该错误是有道理的,因为+它不是有效的数字类型并且它没有被封装为字符串。我尝试使用 reviver 函数和过滤器将值转换为字符串,但没有成功,我也无法将整个内容视为带有JSON.stringify(packet.payload),packet.payload.toString()或的字符串String(packet.payload)。我可以手动将 ASCII 字符转换为 之间的字符串,{但我正在寻找一种更强大、更通用的解决方案,它不会操纵 ASCII。:}

解析在不同的数据包上按预期工作,{"6000":100}以提供预期的键值对返回。

使用.entries()返回了一些奇怪的行为-(在另一个数据包上)它返回6000,100了数组类型,但不能用作数组或数字(据我所知)。这可能暗示发生了什么?

我还想知道是否可以扩展 的行为.parse()以接受表单中的数字+44...或获取该值并将其返回为"+44...".

编辑以获得额外的清晰度:

我想做的第一件事是将来自上游设备(PLC)的输出数据类型限制为仅基元(如 int),但是这是不可能的,甚至是不可执行的,因此我的代理需要能够处理抛出的任何内容即使它是无效的类型。

关于为什么数据包采用 JSON 格式?老实说,我不知道——但我认为这要么是 MQTT 本身的工作方式,要么是我在 Node.js 上运行的 Aedes 代理服务。代理有一个事件publish,每当发布者发布数据包时,该事件就会发出客户端和数据包。这就是我在服务器端接收数据包的方式。

标签: javascriptnode.jsjson

解决方案


以下代码将获取数组并通过缓冲区将其转换回字符串。

var buffer = Buffer.from(packet.payload.array)
var string = buffer.toString('utf8')

在这种情况下,packet.payload它已经是一个缓冲区,那么以下应该可以工作:

var buffer = Bufffer.from(packet.payload)

编辑:

var regex = /{ \"\d+\": (\+\d+) }/
var matches = packet.payload.toString('utf8').match(regex)
var phoneNumber = matches[1] 

推荐阅读