You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 03:30:53