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

JavaScript替换JSON元素报错:Unexpected Token at pos 0求助

嗨,我来帮你排查这个解析错误和函数逻辑的问题~

问题根源与修正方案

你遇到的几个核心问题

  1. 没必要的JSON.parse调用:defaultMessage.dataElements本身就是一个JavaScript对象,不是JSON字符串!JSON.parse()只能处理JSON格式的字符串,直接把对象塞进去肯定会报"unexpected token"错误——这就是你问题的主要原因。
  2. 传入的测试参数是无效JSON:你测试时传的'{"MTI":"1101",{"DE01":"XXX"}}'语法有问题,里面的{"DE01":"XXX"}没有对应的键名,属于不合法的JSON结构。
  3. 函数返回值和测试期望不匹配:你的函数现在只返回修改后的dataElements,但测试用例期望返回包含MTI和完整dataElements的整个消息对象。
  4. 函数定义语法有误:replaceDefaultElements: (testElements) => {这种写法是对象方法的定义,但你的代码里没把它放在一个对象里(比如const functions = {...}),运行时会触发语法错误。

修正后的完整可运行代码

// 先把函数放在一个对象里,符合你测试时的调用方式
const functions = {
  replaceDefaultElements: (testElements) => {
    // 克隆默认消息对象,避免直接修改原数据(浅克隆适合当前的简单结构)
    const updatedMessage = JSON.parse(JSON.stringify(defaultMessage));

    // 兼容传入JSON字符串或直接传对象的情况
    const elementsToReplace = typeof testElements === 'string' 
      ? JSON.parse(testElements) 
      : testElements;

    // 遍历要替换的元素,更新对应字段
    Object.keys(elementsToReplace).forEach(key => {
      // 如果是dataElements里的字段,就更新dataElements
      if (updatedMessage.dataElements[key] !== undefined) {
        updatedMessage.dataElements[key] = elementsToReplace[key];
      }
      // 如果是MTI字段,单独更新
      if (key === 'MTI') {
        updatedMessage.MTI = elementsToReplace[key];
      }
    });

    return updatedMessage;
  }
};

// 你的默认消息对象
var defaultMessage = { 
  "MTI": "1101", 
  dataElements: { 
    "DE01": "101", 
    "DE02": "201", 
    "DE03": "301", 
    "DE04": "401", 
    "DE05": "501", 
    "DE06": "601", 
    "DE07": "701" 
  } 
};

// 修正后的Jest测试用例
test('Should replace specified elements correctly', () => { 
  // 可以直接传对象,比传JSON字符串更直观
  const testInput = {"DE01":"XXX", "MTI":"1101"};
  // 要是想传字符串,得用合法的JSON:'{"DE01":"XXX", "MTI":"1101"}'

  expect(functions.replaceDefaultElements(testInput)).toEqual({ 
    "MTI": "1101", 
    dataElements: { 
      "DE01": "XXX", 
      "DE02": "201", 
      "DE03": "301", 
      "DE04": "401", 
      "DE05": "501", 
      "DE06": "601", 
      "DE07": "701" 
    } 
  });
});

重点说明

  • 不修改原对象:用JSON.parse(JSON.stringify(...))克隆原对象,防止后续操作污染默认消息数据。
  • 参数兼容性:自动处理传入JSON字符串或直接传对象的情况,减少报错概率。
  • 匹配测试预期:现在函数返回的是完整的消息对象,和你测试用例里的期望结果完全一致。
  • 合法JSON格式:确保传入的参数无论是对象还是字符串,都是符合语法规范的。

内容的提问来源于stack exchange,提问作者Prashanna Narayanasamy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:22:29