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

如何在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,实现安全处理。

具体实现步骤:

  1. 导入所需的解析类和类型:
import { Parser, Value, Obj } from 'assemblyscript-json';
  1. 编写安全解析函数,通过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;
}
  1. 调用安全解析函数,根据返回值处理不同情况:
// 示例:传入可能无效的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 18:05:29