JSON Deserializer 使用 moment 处理 JSON 数据中的日期字符串。
npm install json-deserializer
在大型 SPA 应用开发中,前后端数据交互基本都是基于 JSON 的。如果后端使用的是强类型语言(比如 Java ),在获取到前端传递的 JSON 数据的时候,一般会反序列化为某个(或某几个)类的对象,以便后续处理。
那么前端在拿到后端传递的 JSON 数据的时候,由于 JavaScript 对 JSON 天然友好的支持,所以很多时候可以直接 JSON.parse(jsonString)
一下就可以使用了。但是后端开发者很多时候对 JSON 数据理解的不一样,或者强类型语言操作 JSON 很麻烦,造成传递给前端的 JSON 数据总是不尽人意,此时就少不了对后端数据做 normalize 了。
JSON Deserializer 的输入是一个 JSON 对象,输出是一个 JavaScript 对象。
反序列化 JSON 对象。
-
参数
jsonObject
JSON 对象config
schema 配置options
选项配置option.noCircular
boolean
是否支持反序列化循环引用对象。如果是true
,则遇到循环引用就会抛出异常;如果是false
,则会自动跳过循环引用部分。默认true
。option.inputFirst
boolean
是否优先按照输入对象的数据结构进行遍历处理。默认true
。
-
返回值
JavaScript 对象。
- 转换 JSON 数组
import deserialize, {StringParser} from 'json-deserializer';
const jsonObject = [20];
const schema = [StringParser];
deserialize(jsonObject, schema); // result: ['20']
- 转换 JSON 对象
import deserialize, {StringParser} from 'json-deserializer';
const jsonObject = {"name": "yibuyisheng", "age": 20};
const schema = {name: StringParser};
deserialize(jsonObject, schema); // result: {name: 'yibuyisheng'}
- 转换 JSON 基本类型
import deserialize, {StringParser} from 'json-deserializer';
const jsonObject = 'yibuyisheng';
const schema = StringParser;
deserialize(jsonObject, schema); // result: 'yibuyisheng'
校验 JS 对象。
-
参数
obj
JS 对象config
schema 配置options
选项配置option.noCircular
boolean
是否支持反序列化循环引用对象。如果是true
,则遇到循环引用就会抛出异常;如果是false
,则会自动跳过循环引用部分。默认false
。option.inputFirst
boolean
是否优先按照输入对象的数据结构进行遍历处理。默认false
。option.all
boolean
是否一次性搜集对象上所有不合法的属性信息。默认false
。option.flattenResult
boolean
是否将搜集到的错误信息打平。默认false
。
-
返回值
共有三种情况:
true
校验成功,没有非法数据。FlattenResult
当option.flattenResult
设为true
是,如果校验有错,则错误信息会被打平成一个数组,每个数据项都会带有固定属性。any
其余类型数据,跟obj
参数的结构一致,叶子节点上都会包含相应数据的校验结果。
- 校验原始数据
import validate, {VEUIRulesValidator} from 'json-deserializer';
validate('123', {
validator: VEUIRulesValidator,
rules: 'required'
}); // result: true
validate(null, {
validator: VEUIRulesValidator,
rules: 'required'
});
// result:
// {
// detail: [
// {
// message: '请填写',
// name: 'required'
// }
// ],
// keyPath: [],
// message: 'Validate fail with VEUI rules.',
// }
- 校验对象
import validate, {VEUIRulesValidator} from 'json-deserializer';
validate(
{
name: 'yibuyisheng'
},
{
name: {
validator: VEUIRulesValidator,
rules: [
{
name: 'pattern',
value: /^[a-z]+$/
}
]
}
}
); // result: {name: true}
- 拿到打平的结果
import validate, {VEUIRulesValidator} from 'json-deserializer';
validate(
{
name: {
first: 'Li',
last: 'Zhang',
},
},
{
name: {
validator: VEUIRulesValidator,
rules: [
{
name: 'pattern',
value: /^[a-z]+$/,
message: '格式不符合要求',
}
]
},
},
{
flattenResult: true,
}
);
// result:
// [
// {
// keyPath: ['name'],
// result: {
// detail: [{message: '格式不符合要求', name: 'pattern'}],
// keyPath: ['name'],
// message: 'Validate fail with VEUI rules.'
// }
// }
// ]
- [+] 支持 shouldIgnoreUndefined 配置。
- [+] 支持
inputFirst
配置,即以被处理对象的数据结构为准,还是以配置对象的数据结构为准。
- [+] 在 index.js 中导出模块。
- [+] 新增校验器,可以对 JS 对象进行全方位校验,支持检测包含循环引用的对象。
- [+] 支持检测带有循环引用的 JSON 对象。
- [+] 支持对 JSON 对象的 normalize 。