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

Solidity部署合约执行npm run test报JSON解析错误该如何解决?

错误根因

你收到的SyntaxError: Unexpected token o in JSON at position 1报错,本质是你对已经解析完成的JS对象执行了JSON.parse操作:当你给JSON.parse传入非JSON字符串的JS对象时,方法会默认先将对象转为"[object Object]"字符串,解析到第一个字符o时不符合JSON格式要求,直接抛出错误。

你的错误出在Inbox.test.js的部署逻辑里,完全搞反了ABI和字节码的传参位置,还多做了不必要的JSON解析:

// 错误写法
inbox = await new web3.eth.Contract(JSON.parse(evm))
    .deploy({ data: abi, arguments: ['Hi there!'] })
    .send({ from: accounts[0], gas: '1000000' })

修复方案

直接替换beforeEach里的部署逻辑为以下代码即可:

beforeEach(async () => {
    accounts = await web3.eth.getAccounts();
    // 构造Contract实例第一个参数直接传ABI,不需要JSON.parse
    inbox = await new web3.eth.Contract(abi)
        // deploy的data参数传evm下的字节码内容
        .deploy({ data: evm.bytecode.object, arguments: ['Hi there!'] })
        .send({ from: accounts[0], gas: '1000000' })
})

修正点说明:

  1. web3.eth.Contract构造函数第一个入参要求是合约ABI,你从compile.js导出的abi本身就是已经解析完成的JS数组,不需要额外调用JSON.parse
  2. deploy配置的data字段要求传入合约编译后的字节码,对应编译输出里的evm.bytecode.object字段,你之前错误将ABI传给了这个参数
  3. 你从compile.js导出的evm本身就是JS对象,不需要再做JSON解析

额外校验点

如果修复后还有问题,可以确认下你安装的solc依赖版本和合约里声明的pragma solidity >=0.7.0 <0.9.0范围匹配,建议安装0.8.x版本的solc,避免编译输出结构不一致。

内容的提问来源于stack exchange,提问作者Lukas Luke Stateczny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:57:05