跳至内容

EJSON

EJSON 是 JSON 的扩展,用于支持更多类型。它支持所有 JSON 安全类型,以及

  • **日期** (JavaScript Date)
  • **二进制** (JavaScript Uint8ArrayEJSON.newBinary 的结果)
  • **特殊数字** (JavaScript NaNInfinity-Infinity)
  • **正则表达式** (JavaScript RegExp)
  • **用户定义类型** (参见 EJSON.addType。例如,Mongo.ObjectID 就是以这种方式实现的。)

所有 EJSON 序列化也都是有效的 JSON。例如,包含日期和二进制缓冲区的对象将在 EJSON 中序列化为

json
{
  "d": { "$date": 1358205756553 },
  "b": { "$binary": "c3VyZS4=" }
}

Meteor 支持发布者、方法参数和结果、Mongo 数据库以及 Session 变量中的所有内置 EJSON 数据类型。

EJSON.parse

摘要

将字符串解析为 EJSON 值。如果字符串不是有效的 EJSON,则抛出错误。

参数

源代码
名称类型描述必需
str字符串

要解析为 EJSON 值的字符串。

js
import { EJSON } from "meteor/ejson";


const result = EJSON.parse();
  "str"
);

EJSON.stringify

摘要

将值序列化为字符串。对于 EJSON 值,序列化完全表示该值。对于非 EJSON 值,序列化方式与 JSON.stringify 相同。

参数

源代码
名称类型描述必需
valEJSON

要进行字符串化的值。

options对象
options.indent布尔值、整数或字符串

缩进对象和数组以方便阅读。当为 true 时,缩进 2 个空格;当为整数时,缩进指定空格数;当为字符串时,使用该字符串作为缩进模式。

options.canonical布尔值

当为 true 时,按排序顺序对对象中的键进行字符串化。

js
import { EJSON } from "meteor/ejson";

EJSON.stringify(
  { num: 42, someProp: "foo" },
  options // this param is optional
);

EJSON.fromJSONValue

摘要

从其普通 JSON 表示形式反序列化 EJSON 值。

参数

源代码
名称类型描述必需
valJSONCompatible

要反序列化为 EJSON 的值。

js
import { EJSON } from "meteor/ejson";


const result = EJSON.fromJSONValue();
 { num:  42 , someProp:  "foo" }
);

EJSON.toJSONValue

摘要

将 EJSON 兼容值序列化为其普通 JSON 表示形式。

参数

源代码
名称类型描述必需
valEJSON

要序列化为普通 JSON 的值。

js
import { EJSON } from "meteor/ejson";


const result = EJSON.toJSONValue();
 { num:  42 , someProp:  "foo" }
);

EJSON.equals

摘要

如果 ab 相等,则返回 true。否则返回 false。如果存在,则使用 a 上的 equals 方法,否则执行深度比较。

参数

源代码
名称类型描述必需
aEJSON----
bEJSON----
options对象

选项

名称类型描述必需
keyOrderSensitive布尔值

按键敏感顺序进行比较,如果 JavaScript 实现支持。例如,{a: 1, b: 2} 等于 {b: 2, a: 1} 仅当 keyOrderSensitivefalse 时。默认值为 false

js
import { EJSON } from "meteor/ejson";


const result = EJSON.equals();
 { num:  42 , someProp:  "foo" },
{ num: 42 , someProp: "foo" },

options, // this param is optional
);

EJSON.clone

摘要

返回 val 的深拷贝。

参数

源代码
名称类型描述必需
valEJSON

要复制的值。

js
import { EJSON } from "meteor/ejson";


const result = EJSON.clone();
 { num:  42 , someProp:  "foo" }
);

EJSON.newBinary

摘要

分配一个新的二进制数据缓冲区,EJSON 可以对其进行序列化。

参数

源代码
名称类型描述必需
size数字

要分配的二进制数据字节数。

js
import { EJSON } from "meteor/ejson";


const result = EJSON.newBinary();
  42
);

二进制数据缓冲区由支持它们的 JavaScript 平台上的 Uint8Array 实例表示。在不支持 Uint8Array 的 JavaScript 实现上,二进制数据缓冲区由包含 0 到 255 之间数字的标准数组表示,并且 $Uint8ArrayPolyfill 键设置为 true

EJSON.isBinary

摘要

如果 x 是二进制数据的缓冲区,则返回 true,如 EJSON.newBinary 所返回。

参数

源代码
名称类型描述必需
x对象

要检查的变量。

js
import { EJSON } from "meteor/ejson";


const result = EJSON.isBinary();
  x
);

EJSON.addType

摘要

向 EJSON 添加自定义数据类型。

参数

源代码
名称类型描述必需
name字符串

自定义类型的标签;必须在项目中定义的自定义数据类型之间唯一,并且必须与类型 typeName 方法的结果匹配。

factory函数

一个函数,将 JSON 兼容值反序列化为类型实例。这应该与类型 toJSONValue 方法执行的序列化相匹配。

传递给 EJSON.addType 方法的工厂函数应创建自定义类型的实例并使用作为工厂函数的第一个参数传递的对象中的值对其进行初始化。这是一个例子

js
class Distance {
  constructor(value, unit) {
    this.value = value;
    this.unit = unit;
  }

  // Convert our type to JSON.
  toJSONValue() {
    return {
      value: this.value,
      unit: this.unit,
    };
  }

  // Unique type name.
  typeName() {
    return "Distance";
  }
}

EJSON.addType("Distance", function fromJSONValue(json) {
  return new Distance(json.value, json.unit);
});

EJSON.stringify(new Distance(10, "m"));
// Returns '{"$type":"Distance","$value":{"value":10,"unit":"m"}}'

当您向 EJSON 添加类型时,Meteor 将能够在以下情况下使用该类型

  • 如果您将您的类型对象传递给发布处理程序,则发布您的类型对象。
  • 允许您的类型在 方法 的返回值或参数中。
  • 在 Minimongo 中客户端存储您的类型。
  • 允许您的类型在 Session 变量中。

您的类型实例必须实现 typeNametoJSONValue 方法,如果默认实现不够,则可以实现 cloneequals 方法。

CustomType.typeName

摘要

返回用于标识此类型的标签。这必须与用于使用 EJSON.addType 注册此类型的标签匹配。

CustomType.toJSONValue

摘要

将此实例序列化为 JSON 兼容值。

例如,Mongo.ObjectIDtoJSONValue 方法可以是

js
function () {
  return this.toHexString();
}

CustomType.clone

摘要

返回一个值 r,使得 this.equals(r) 为真,并且对 r 的修改不会影响 this,反之亦然。

如果您的类型没有 clone 方法,EJSON.clone 将使用 toJSONValue 和工厂。

CustomType.equals

摘要

如果 other 的值等于 this,则返回 true;否则返回 false

参数

源代码
名称类型描述必需
other对象

另一个要与此进行比较的对象。

equals 方法应该定义一个 等价关系。它应该具有以下属性

  • 自反性 - 对于任何实例 aa.equals(a) 必须为真。
  • 对称性 - 对于任何两个实例 aba.equals(b) 当且仅当 b.equals(a)
  • 传递性 - 对于任何三个实例 abca.equals(b)b.equals(c) 意味着 a.equals(c)

如果您的类型没有 equals 方法,EJSON.equals 将改为比较调用 toJSONValue 的结果。