javascript - 如何将电话号码解析为 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
,每当发布者发布数据包时,该事件就会发出客户端和数据包。这就是我在服务器端接收数据包的方式。
解决方案
以下代码将获取数组并通过缓冲区将其转换回字符串。
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]
推荐阅读
- angular - Angular Material 数据表 - 尝试加载数据
- php - ACF:使用 load_field 使用帖子功能图像 url 预填充字段
- python - Python Pandas 转置 DataFrame 并重命名列
- python - Python、paramiko 和正向代理 ssh
- python - 如何创建一个 numpy 数组,该数组对应于一个点是否在一个 numpy 多边形数组内?
- kubernetes - 添加新的 kubernetes master 时出现未经授权的问题
- dns - dnsmasq 可以按指定顺序返回记录吗?
- version-control - Zerobrane 的版本控制
- ecmascript-6 - VSCode“转到定义”:如何显示未编译的 ES6 文件?
- java - 如何以 UTF-8 获取用户输入?