easy-json-convert

npm install easy-json-convert

Usage no npm install needed!

<script type="module">
  import easyJsonConvert from 'https://cdn.skypack.dev/easy-json-convert';
</script>

README

1、 安装

npm install easy-json-convert

2、使用

var jsonConvert  = require('easy-json-convert');

3 API方法

3.1 jsonConvert.convert (input, json|jsonSchema, [options]) json数据转换器

   参数1: 输入数据,任何结构的标准json数据
   参数2:输出结构模板,任何结构的标准json数据或jsonSchema(json描述对象,由jsonConvert.schema方法生成)
   参数3:全局配置options
        * @param {String}   options.requiredSign        标记必须存在的属性标识
        * @param {String}   options.aliasSign           标记别名属性标识
        * @param {Boolean}  options.allRequired         默认全部属性必须存在
        
        * @param {Object}   options.defaults            默认取值配置
        * @param {String}   options.defaults.string     字符串类型默认值
        * @param {Number}   options.defaults.number     数字类型默认值
        * @param {Boolean}  options.defaults.boolean    布尔类型默认值
        * @param {Null}     options.defaults.null       空类型默认值
        
        * @param {Object}   options.filters            转换值过滤器
        * @param {Function} options.filters.string     字符串类型过滤器
        * @param {Function} options.filters.number     字符串类型过滤器
        * @param {Function} options.filters.boolean    字符串类型过滤器
        * @param {Function} options.filters.null       字符串类型过滤器
        * @param {Function} options.filters.array      字符串类型过滤器
        * @param {Function} options.filters.object     字符串类型过滤器

3.2 jsonConvert.schema (json, [options]) 根据指定json数据,生成json描述对象(jsonSchema)

    参数1:待转换的json数据
    参数2:全局配置options
        * @param {String}   options.requiredSign        标记必须存在的属性标识
        * @param {String}   options.aliasSign           标记别名属性标识
        * @param {Boolean}  options.allRequired         默认全部属性必须存在
    
    示例:
    var json = {
         'string': 'abc',
    }
    转换后:
    {
        "type": "object",
        "required": [],
        "properties": {
            "string": {
                "key": "string",
                "type": "string"
            }
        }
    }

3.3 jsonConvert(input, json|jsonSchema, [options]) json数据转换器

同jsonConvert.convert方法一样,jsonConvert.convert的简单调用方式(推荐写法),以后的示例中都将使用此方法

4 示例

4.1.1 简单使用

根据模板值自动获取字段的类型
var jsonConvert  = require('easy-json-convert');

var input = {
     "string": "abc",
     "number": 123456,
     "boolean": true,
     "null": null,
     "array": [1, 2, 3, 4],
     "object": {
        "name" : "youlu"
    }
}

var template = {
    "string": "",
    "number": 0,
    "boolean": true,
    "null": null,
    "array": [],
    "object": {}
}

jsonConvert(input, template);

// 输出数据
var output = {
    "string": "abc",
    "number": 123456,
    "boolean": true,
    "null": null,
    "array": [1, 2, 3, 4],
    "object": {
       "name" : "youlu"
    }
}

4.1.2 自定义字段的数据类型

自动转换成同模板一样的数据类型

var input = {
    "string": "abc",
    "number": "123456",
    "boolean": 1,
    "null": '',
    "array": [1, 2, 3, 4],
    "object": {a: 1, b: 2}
}

var template =  {
    'string': {
        type: 'string',
    },
    'number': {
        type: 'number',
    },
    'boolean': {
        type: 'boolean',
    },
    'null': {
        type: 'null',
    },
    'array': {
        type: 'array',
    },
    'object': {
        type: 'object',
    },
};

jsonConvert(input, template);

// 输出数据
var output = {
    "string": "abc",
    "number": 123456,
    "boolean": true,
    "null": null,
    "array": [1, 2, 3, 4],
    "object": {a: 1, b: 2}
}

4.2.1 别名

当输入数据字段名与输出字段名不一致时,可以使用@(可以自定义任何符号,详见4.2.2)指定输入字段的别名

var input = {
    "string": "abc",
    "number": 123456,
    "boolean": true,
    "null": null,
    "array": [],
    "object": {}
}

var template = {
    'str@string': 'abc',
    'num@number': 123456,
    'bool@boolean': true,
    'empty@null': null,
    'arr@array': [],
    'obj@object': {},
}

jsonConvert(input, template);

// 输出数据
var output = {
    "str": "abc",
    "num": 123456,
    "bool": true,
    "empty": null,
    "arr": [],
    "obj": {}
}
 
4.2.2 使用"|"指定别名
var jsonConvert  = require('easy-json-convert');

var input = {
    "string": "abc",
    "number": 123456,
    "boolean": true,
    "null": null,
    "array": [],
    "object": {}
}

var template = {
    'str|string': 'abc',
    'num|number': 123456,
    'bool|boolean': true,
    'empty|null': null,
    'arr|array': [],
    'obj|object': {},
}

jsonConvert(input, template, {
    aliasSign: '|',
});

// 输出数据
var output = {
    "str": "abc",
    "num": 123456,
    "bool": true,
    "empty": null,
    "arr": [],
    "obj": {}
}
 
4.3.1 使用*(可以自定义任意符号,详见4.3.3)号标记为必须项

无论输入数据是否包含该字段,输出数据中都会存在(根据模板定义的类型,自动返回对应的默认值)

var input = {
    "string": "abc",
    "number": 123456,
    "boolean": true,
    "null": null,
    "array": [],
    "object": {}
}

var template = {
    '*str': 'abc',
    '*num': 123456,
    '*bool': true,
    '*empty': null,
    '*arr': [],
    '*obj': {},
};

jsonConvert(input, jsonTemplate);

// 输出数据
var output = {
    "str": "",
    "num": 0,
    "bool": false,
    "empty": null,
    "arr": [],
    "obj": {}
}

4.3.2 使用allRequired参数

allRequired=true 将标记所有项为必须项,不需要每项前面都添加*号了


var input = {
    "api": null,
    "result": "000000",
    "msg": null,
    "data": [
        {
            "id": "PROJECT20191126010000000338",
            "name": "医卫学院",
            "subList": [
                {
                    "id": "PROJECT20191126010000000243",
                    "name": "中医医术确有专长医师",
                    "subList": []
                },
                {
                    "id": "PROJECT20191126010000000405",
                    "name": "中医康复技术",
                    "subList": []
                },
                {
                    "id": "PROJECT20191126010000000168",
                    "name": "中医助理医师",
                    "subList": []
                }
            ]
        },
        {
            "id": "PROJECT20191126010000000333",
            "subList": [
                {
                    "name": "中医医术确有专长医师",
                    "subList": []
                },
                {
                    "id": "PROJECT20191126010000000243",
                    "subList": []
                },
                {
                    "id": "PROJECT20191126010000000243",
                    "name": "中医助理医师"
                }
            ]
        },
        {
           // 这里是个空对象,输出时返回一个同模板一样的结构
        }
    ],
    "seqno": null,
    "seqno2": null,
    "seqno3": null,
    "cid": null,
    "timestamp": null
}

var templatr = {
    'api': '',
    'result': '000000',
    'msg': '',
    'data': [
        {
            'id': 'PROJECT20191126010000000338',
            'name': '医卫学院',
            'subList': [
                {
                    'id': 'PROJECT20191126010000000243',
                    'name': '中医医术确有专长医师',
                    'subList': [],
                },
            ],
        },
    ],
    'seqno': '',
    'cid': '',
    'timestamp': 123,
}

// 输出数据
var output = {
  "api": "",
    "result": "000000",
    "msg": "",
    "data": [
        {
            "id": "PROJECT20191126010000000338",
            "name": "医卫学院",
            "subList": [
                {
                    "id": "PROJECT20191126010000000243",
                    "name": "中医医术确有专长医师",
                    "subList": []
                },
                {
                    "id": "PROJECT20191126010000000405",
                    "name": "中医康复技术",
                    "subList": []
                },
                {
                    "id": "PROJECT20191126010000000168",
                    "name": "中医助理医师",
                    "subList": []
                }
            ]
        },
        {
            "id": "PROJECT20191126010000000333",
            "name": "",
            "subList": [
                {
                    "id": "", // 输入数据不存在ID,根据模板规则将返回一个默认值
                    "name": "中医医术确有专长医师",
                    "subList": []
                },
                {
                    "id": "PROJECT20191126010000000243",
                    "name": "", // 输入数据不存在ID,根据模板规则将返回一个默认值
                    "subList": []
                },
                {
                    "id": "PROJECT20191126010000000243",
                    "name": "中医助理医师",
                    "subList": []
                }
            ]
        },
        {
            // 和模板结构保持一致性
            "id": "",
            "name": "",
            "subList": []
        }
    ],
    "seqno": "",
    "cid": "",
    "timestamp": 0
}
 
4.3.3 使用"?"号标记为必须项

无论输入数据是否包含该项,输出数据中都会存在(根据模板定义的类型,自动返回对应的默认值)


var input = {
    "string": "abc",
    "number": 123456,
    "boolean": true,
    "null": null,
    "array": [],
    "object": {}
}

var template = {
    '?str': 'abc',
    '?num': 123456,
    '?bool': true,
    '?empty': null,
    '?arr': [],
    '?obj': {},
};

jsonConvert(input, jsonTemplate, {
     requiredSign: '?',
});

// 输出数据
var output = {
    "str": "",
    "num": 0,
    "bool": false,
    "empty": null,
    "arr": [],
    "obj": {}
}

4.4.1 全局默认值

只有设置必须项目后才能生效,根据模板值自动获取默认值

var input = {
    "string": "abc",
    "number": 123456,
    "boolean": true,
    "null": null,
    "array": [],
    "object": {}
}

var template = {
    '*str': 'abc',
    '*num': 123456,
    '*bool': true,
    '*empty': null,
    '*arr': [],
    '*obj': {},
}

jsonConvert(input, jsonTemplate);

// 输出数据
var output = {
    "str": "",
    "num": 0,
    "bool": false,
    "empty": null,
    "arr": [],
    "obj": {}
}


4.4.2 默认值

输入字段不存在时,返回自定义默认值

var input = {
    "string": "abc",
    "number": 123456,
    "boolean": true,
    "null": null,
    "array": [],
    "object": {}
}

var template = {
    '*string': {
        type: 'string',
        default: 'abc',
    },
    '*num': {
        type: 'string',
        default: 123456,
    },
    '*bool': {
        type: 'string',
        default: true,
    },
    '*empty': {
        type: 'string',
        default: null,
    },
    '*arr': {
        type: 'string',
        default: [1, 2, 3, 4],
    },
    '*obj': {
        type: 'object',
        default: {a: 1, b: 2},
    },
}

jsonConvert(input, jsonTemplate);

// 输出数据
var output = {
    "string": "abc",
    "num": 123456,
    "bool": true,
    "empty": null,
    "arr": [
        1,
        2,
        3,
        4
    ],
    "obj": {
        "a": 1,
        "b": 2
    }
}
4.4.3 全局默认值

输入字段不存在时,根据类型返回全局默认值

var input = {
} 

var template = {
    "*string": "abc",
    "*number": 123456,
    "*boolean": true,
    "*null": null,
    "*array": [],
    "*object": {}
}

jsonConvert(input, jsonTemplate);

// 输出数据
var output = {
    "string": "default",
    "number": 123456,
    "boolean": true,
    "null": null,
    "array": [0, 1, 2],

    "object": {
        "default": "default"
    }
}

4.5.1 过滤器
var input = {
    "string": 123456,
    "number": "123456",
    "boolean": "0"
}

var template = {
    'string': {
        type: 'string',
        filter(val) {
            return String(val);
        },
    },
    'number': {
        type: 'number',
        filter(val) {
            return Number(val);
        },
    },
    'boolean': {
        type: 'boolean',
        filter(val) {
            return Boolean(val);
        },
    },
}

// 输出数据
var output = {
    "string": "123456",
    "number": 123456,
    "boolean": true
}