如何在Subgraph中用assemblyscript-json处理JSON.parse的无效格式异常?
问题描述
以下代码可正常运行:
let jsonObj: JSON.Obj = <JSON.Obj>(JSON.parse('{"hello": "world", "value": 24}'));
但如果JSON字符串格式无效,会直接破坏我的Subgraph。
使用的依赖版本:
"@graphprotocol/graph-cli": "0.35.0", "@graphprotocol/graph-ts": "0.29.0", "assemblyscript-json": "1.1.0"
由于AssemblyScript不支持错误处理(try/catch),请问是否有办法用assemblyscript-json处理无效JSON字符串?
解决办法
因为AssemblyScript没有原生try/catch,直接用JSON.parse遇到无效JSON会触发panic,导致Subgraph崩溃。可以利用assemblyscript-json提供的手动解析工具类,通过分步解析并校验的方式避免panic,实现安全处理。
具体实现步骤:
- 导入所需的解析类和类型:
import { Parser, Value, Obj } from 'assemblyscript-json';
- 编写安全解析函数,通过
Parser类逐步验证JSON有效性:
function safeParseJson(jsonStr: string): Obj | null { const parser = new Parser(jsonStr); // 尝试解析JSON值 const parsedValue = parser.parseValue(); // 校验:解析完成后,parser的偏移量应等于字符串长度(说明整个JSON被完整解析) if (parser.offset !== jsonStr.length || parsedValue === null) { return null; } // 校验解析结果是否为对象类型 if (!parsedValue.isObj()) { return null; } return parsedValue as Obj; }
- 调用安全解析函数,根据返回值处理不同情况:
// 示例:传入可能无效的JSON字符串 const targetJson = '{"hello": "world", "value": 24}'; const validObj = safeParseJson(targetJson); if (validObj !== null) { // 处理有效JSON的逻辑 const helloStr = validObj.getString('hello'); const valueNum = validObj.getInteger('value'); } else { // 处理无效JSON的逻辑,比如跳过当前处理、记录异常标识等 }
核心逻辑:Parser类的parseValue方法不会直接panic,而是返回null表示解析失败;同时通过检查parser.offset与字符串长度是否一致,能确保JSON是完整有效的,避免部分解析的情况。
内容的提问来源于stack exchange,提问作者Sami
相关产品推荐
相关产品推荐

