Javascript 我们如何创建JSON模式,在纯JSON的基础上构建一个基于角度的表单?

Javascript 我们如何创建JSON模式,在纯JSON的基础上构建一个基于角度的表单?,javascript,json,angular,angular-formly,Javascript,Json,Angular,Angular Formly,我们有一个需求,我们计划根据收到的JSON构建一个表单,并将其转换为formlyJsonschema支持的JSON模式,有什么方法可以实现这一点吗 Eg JSON: { "isSignInRequired": true, "isEmployee": false, "noOfEmployees": { "minValue": 3, "maxValue": 50 } } 要求:如果值是

我们有一个需求,我们计划根据收到的JSON构建一个表单,并将其转换为formlyJsonschema支持的JSON模式,有什么方法可以实现这一点吗

Eg JSON:

{
 "isSignInRequired": true,
 "isEmployee": false,
 "noOfEmployees": {
 "minValue": 3,
 "maxValue": 50
 }
}
要求:如果值是布尔值,则转换为切换类型,如果存在整数或字符串值,则转换为文本框类型

formlyJsonschema支持的所需转换JSON模式如下:

"schema" :[
{
 "properties": {
 "isSignInRequired": {
 "type": "toggle",
 "default": true
 },
 "isEmployee": {
 "type": "toggle",
 "default": true
 }
}
},
{
"description": "noOfEmployees",
"type": "object",
"properties": {
"minValue": {
"type": "integer",
"title": "minValue"
},
"maxValue": {
"type": "integer",
"title": "maxValue",
"minLength": 3
}
}
}]
我尝试使用一些基于JSON模式的示例,但无法满足我的要求,示例如下:


无法从一个数据样本中派生出
默认值
最大长度
断言,但您可以假定
类型
属性
。您可以选择假设其他断言,例如
附加属性

var data = {
    "isSignInRequired": true,
    "isEmployee": false,
    "noOfEmployees": {
        "minValue": 3,
        "maxValue": 50
    }
};

// could use lodash mapValues instead
var mapValues = (fn, data) => Object.keys(data).reduce((accum, key) => ({ ...accum, [key]: fn(data[key], key) }), {});

var toSchemaType = data =>
    Array.isArray(data)
        ? 'array'
        : typeof data;

var deriveSchema = (data, key) => ({
    type: toSchemaType(data),
    ...(key && { title: key }),
    ...(toSchemaType(data) === 'object' && {
        properties: mapValues(deriveSchema, data)
    })
});

deriveSchema(data)

您还需要阵列支持吗?您可以修改
toSchemaType
函数以返回
切换
。我没有这样做,因为表单技术会像那样破坏json模式是毫无意义的。函数deriveSchema()的关键参数是什么?我们减少了数据对象中的键,因此键是
isSignInRequired
isEmployee
,等。密钥被传入,以便它可以用作架构的
标题。在根对象模式中没有键,因此键参数是可选的。感谢您的支持,我能够构建表单,但我需要一些支持,我在JSON中使用数组,而不是模式类型到数组,我正在转换为类型对象,现在我有了带有“name”的属性在json中,我想为它显示标签,这里是一个演示示例:如果您能深入了解这一点,这将非常有用。非常感谢。