EJSON
EJSON 是 JSON 的扩展,用于支持更多类型。它支持所有 JSON 安全类型,以及
- **日期** (JavaScript
Date
) - **二进制** (JavaScript
Uint8Array
或EJSON.newBinary
的结果) - **特殊数字** (JavaScript
NaN
、Infinity
和-Infinity
) - **正则表达式** (JavaScript
RegExp
) - **用户定义类型** (参见
EJSON.addType
。例如,Mongo.ObjectID
就是以这种方式实现的。)
所有 EJSON 序列化也都是有效的 JSON。例如,包含日期和二进制缓冲区的对象将在 EJSON 中序列化为
{
"d": { "$date": 1358205756553 },
"b": { "$binary": "c3VyZS4=" }
}
Meteor 支持发布者、方法参数和结果、Mongo 数据库以及 Session
变量中的所有内置 EJSON 数据类型。
EJSON.parse
摘要
将字符串解析为 EJSON 值。如果字符串不是有效的 EJSON,则抛出错误。
参数
源代码名称 | 类型 | 描述 | 必需 |
---|---|---|---|
str | 字符串 | 要解析为 EJSON 值的字符串。 | 是 |
import { EJSON } from "meteor/ejson";
EJSON.parse(
"str"
);
EJSON.stringify
摘要
将值序列化为字符串。对于 EJSON 值,序列化完全表示该值。对于非 EJSON 值,序列化方式与 JSON.stringify
相同。
参数
源代码名称 | 类型 | 描述 | 必需 |
---|---|---|---|
val | EJSON | 要进行字符串化的值。 | 是 |
options | 对象 | 否 | |
options.indent | 布尔值、整数或字符串 | 缩进对象和数组以方便阅读。当为 | 否 |
options.canonical | 布尔值 | 当为 | 否 |
import { EJSON } from "meteor/ejson";
EJSON.stringify(
{ num: 42, someProp: "foo" },
options // this param is optional
);
EJSON.fromJSONValue
摘要
从其普通 JSON 表示形式反序列化 EJSON 值。
参数
源代码名称 | 类型 | 描述 | 必需 |
---|---|---|---|
val | JSONCompatible | 要反序列化为 EJSON 的值。 | 是 |
import { EJSON } from "meteor/ejson";
EJSON.fromJSONValue(
{ num: 42 , someProp: "foo" }
);
EJSON.toJSONValue
摘要
将 EJSON 兼容值序列化为其普通 JSON 表示形式。
参数
源代码名称 | 类型 | 描述 | 必需 |
---|---|---|---|
val | EJSON | 要序列化为普通 JSON 的值。 | 是 |
import { EJSON } from "meteor/ejson";
EJSON.toJSONValue(
{ num: 42 , someProp: "foo" }
);
EJSON.equals
摘要
如果 a
和 b
相等,则返回 true。否则返回 false。如果存在,则使用 a
上的 equals
方法,否则执行深度比较。
参数
源代码名称 | 类型 | 描述 | 必需 |
---|---|---|---|
a | EJSON | ---- | 是 |
b | EJSON | ---- | 是 |
options | 对象 | 否 |
import { EJSON } from "meteor/ejson";
EJSON.equals(
{ num: 42 , someProp: "foo" },
{ num: 42 , someProp: "foo" },
options, // this param is optional
);
EJSON.clone
摘要
返回 val
的深拷贝。
参数
源代码名称 | 类型 | 描述 | 必需 |
---|---|---|---|
val | EJSON | 要复制的值。 | 是 |
import { EJSON } from "meteor/ejson";
EJSON.clone(
{ num: 42 , someProp: "foo" }
);
EJSON.newBinary
摘要
分配一个新的二进制数据缓冲区,EJSON 可以对其进行序列化。
参数
源代码名称 | 类型 | 描述 | 必需 |
---|---|---|---|
size | 数字 | 要分配的二进制数据字节数。 | 是 |
import { EJSON } from "meteor/ejson";
EJSON.newBinary(
42
);
二进制数据缓冲区由支持它们的 JavaScript 平台上的 Uint8Array
实例表示。在不支持 Uint8Array
的 JavaScript 实现上,二进制数据缓冲区由包含 0 到 255 之间数字的标准数组表示,并且 $Uint8ArrayPolyfill
键设置为 true
。
EJSON.isBinary
摘要
如果 x
是二进制数据的缓冲区,则返回 true,如 EJSON.newBinary
所返回。
参数
源代码名称 | 类型 | 描述 | 必需 |
---|---|---|---|
x | 对象 | 要检查的变量。 | 是 |
import { EJSON } from "meteor/ejson";
EJSON.isBinary(
x
);
EJSON.addType
摘要
向 EJSON 添加自定义数据类型。
参数
源代码名称 | 类型 | 描述 | 必需 |
---|---|---|---|
name | 字符串 | 自定义类型的标签;必须在项目中定义的自定义数据类型之间唯一,并且必须与类型 | 是 |
factory | 函数 | 一个函数,将 JSON 兼容值反序列化为类型实例。这应该与类型 | 是 |
传递给 EJSON.addType
方法的工厂函数应创建自定义类型的实例并使用作为工厂函数的第一个参数传递的对象中的值对其进行初始化。这是一个例子
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 将能够在以下情况下使用该类型
您的类型实例必须实现 typeName
和 toJSONValue
方法,如果默认实现不够,则可以实现 clone
和 equals
方法。
例如,Mongo.ObjectID
的 toJSONValue
方法可以是
function () {
return this.toHexString();
}
如果您的类型没有 clone
方法,EJSON.clone
将使用 toJSONValue
和工厂。
equals
方法应该定义一个 等价关系。它应该具有以下属性
- 自反性 - 对于任何实例
a
:a.equals(a)
必须为真。 - 对称性 - 对于任何两个实例
a
和b
:a.equals(b)
当且仅当b.equals(a)
。 - 传递性 - 对于任何三个实例
a
、b
和c
:a.equals(b)
和b.equals(c)
意味着a.equals(c)
。
如果您的类型没有 equals
方法,EJSON.equals
将改为比较调用 toJSONValue
的结果。