如何使用JavaScript将设备发送的JSON数据包转换为键值对
把设备JSON数据转成键值对的JavaScript实现
首先,你的数据包开头带有时间戳,得先把纯JSON部分提取出来才能处理。下面是完整的处理代码,包含提取JSON、解析并转换为扁平化的键值对,还会自动转换部分值的类型(比如数字、布尔值):
function convertDeviceData(rawData) { // 提取开头时间戳后的JSON部分(找到第一个{的位置) const jsonStartIndex = rawData.indexOf('{'); const jsonStr = rawData.slice(jsonStartIndex); // 解析JSON为JS对象 const deviceObj = JSON.parse(jsonStr); // 初始化结果对象,先复制顶层的键值对 const keyValuePairs = { IsForward: deviceObj.IsForward, Name: deviceObj.Name, SIN: deviceObj.SIN, MIN: deviceObj.MIN }; // 遍历Fields数组,把每个字段的Name作为键,Value转为对应类型后作为值 deviceObj.Fields.forEach(field => { let value = field.Value; // 尝试转换数字类型 if (!isNaN(value) && value.trim() !== '') { value = Number(value); } // 转换布尔类型 else if (value === 'true' || value === 'false') { value = value === 'true'; } // 其他类型保持字符串 keyValuePairs[field.Name] = value; }); return keyValuePairs; } // 使用示例 const rawPacket = `2022-10-16 07:41:20,348 { "IsForward": false, "Name": "IgnitionOn", "Fields": [ { "Type": "signedint", "Name": "Latitude", "Value": "5460000" }, { "Type": "signedint", "Name": "Longitude", "Value": "10860000" }, { "Name": "Speed", "Value": "0" }, { "Name": "Heading", "Value": "361" }, { "Name": "EventTime", "Value": "1665906013" }, { "Name": "GpsFixAge", "Value": "1023" }, { "Name": "IsIgnitionOn", "Value": "true" }, { "Name": "Odometer", "Value": "0" }, { "Name": "CellStatus", "Value": "ServerConnected" }, { "Name": "CellRoamingList", "Value": "White" }, { "Name": "CellRssi", "Value": "10" } ], "SIN": 254, "MIN": 4 }`; const result = convertDeviceData(rawPacket); console.log(result);
代码说明:
- 提取JSON部分:通过
indexOf('{')找到JSON的起始位置,截取后得到纯JSON字符串。 - 解析JSON:用
JSON.parse()将字符串转为JavaScript对象。 - 构建键值对:先把顶层的
IsForward、Name、SIN、MIN直接加入结果,再遍历Fields数组,将每个字段的Name作为键,Value根据内容自动转为数字、布尔或保留字符串。 - 类型转换:避免所有值都是字符串,让数字和布尔值更实用。
运行后你会得到一个扁平化的键值对对象,示例输出:
{ IsForward: false, Name: "IgnitionOn", SIN: 254, MIN: 4, Latitude: 5460000, Longitude: 10860000, Speed: 0, Heading: 361, EventTime: 1665906013, GpsFixAge: 1023, IsIgnitionOn: true, Odometer: 0, CellStatus: "ServerConnected", CellRoamingList: "White", CellRssi: 10 }
内容的提问来源于stack exchange,提问作者Salman Saeed
相关产品推荐
相关产品推荐

