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

MongoDB Realm返回带类型标识的BJSON如何转换为标准JSON

解决方案

你碰到的是MongoDB扩展JSON(EJSON)的格式特性,Realm默认返回带类型标识的EJSON是为了完整保留MongoDB的字段类型信息,不需要手动实现递归解析,有三种成熟方案可选:

方案1:使用官方bson库解析(最推荐,全类型兼容)

先安装MongoDB官方的BSON处理包:

npm install bson

请求拿到原始返回数据后调用EJSON反序列化即可自动处理所有嵌套结构的类型标识:

import { EJSON } from 'bson';

// 替换为你自己的请求逻辑
const rawData = await fetch(yourRealmWebhookUrl).then(res => res.json());
const parsedData = EJSON.deserialize(rawData);

该方法可以自动适配$numberInt、$numberLong、$date、$objectId等所有MongoDB专属类型标识,无需额外处理嵌套层级。

方案2:用JSON.parse原生钩子实现(无额外依赖)

如果不想引入第三方依赖,可以直接用JSON.parse的reviver参数自定义解析逻辑:

// 先拿到接口返回的原始字符串,不要直接调用res.json()
const rawText = await fetch(yourRealmWebhookUrl).then(res => res.text());
const parsedData = JSON.parse(rawText, (key, value) => {
  // 处理整数类型
  if (value && typeof value === 'object' && '$numberInt' in value) {
    return parseInt(value.$numberInt, 10);
  }
  // 可按需扩展其他类型处理逻辑,比如长整型、浮点数
  if (value && typeof value === 'object' && '$numberLong' in value) {
    return parseInt(value.$numberLong, 10);
  }
  if (value && typeof value === 'object' && '$numberDouble' in value) {
    return parseFloat(value.$numberDouble);
  }
  return value;
});

方案3:Realm Webhook服务端直接返回标准JSON(一劳永逸)

直接修改Webhook的服务端逻辑,返回时用relaxed模式序列化EJSON,前端不需要做任何兼容处理:

// Realm Webhook服务端代码示例
exports = async function(payload, response) {
  // 替换为你自己的数据库查询逻辑
  const queryResult = await context.services.get("mongodb-atlas").db("你的库名").collection("你的集合名").find({});
  // 用relaxed模式序列化,自动去掉所有类型标识
  response.setBody(EJSON.stringify(queryResult, { relaxed: true }));
  response.setContentType("application/json");
  return;
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 14:15:03