将属性添加到json-schema中的字段,以将架构与Web UI紧密耦合

时间:2015-08-02 22:31:45

标签: json jsonschema

我的应用程序将从上游系统接收大型json有效负载。这个upteam系统本质上是一个UI,它将从用户收集业务需求,将这些问题和事实格式化为json有效负载,并将json传输到我的应用程序,该应用程序将根据json-schema标准定义的模式对其进行验证。难题在于,这个上游系统是由不同的团队构建的,他们并不一定了解需要捕获的所有业务需求。

采取以下架构:

schema = {
    "$schema": "http://json-schema.org/draft-04/schema#",
    "title":"Requirements",
    "description": "A Business Requirements Payload",
    "type": "object",
    "properties": {
        "full_name": {
            "type": "string"
        },
        "sex": {
            "enum": ["m", "f"]
        },
        "age": {
            "type": "number"
        },
        "consents": {
            "type": "boolean"
        }
    },
    "required": ["full_name", "sex", "age", "consents"],
    "additionalProperties": False
}

假设上游系统不知道full_namesexage是什么。目前,我正在召开会议,解释我需要的每个字段/问题/事实的性质,应该显示在UI上的默认值,附带应显示给每个字段的文本标签等。

在集思广益的机制中,让每个人都更容易,我想到了将我创建的json-schema紧密耦合到上游系统正在构建的UI。如果我在json-schema本身中包含这些细节,将json-schema交给上游系统,让UI团队生成带有附带文本标签,默认值等的UI,该怎么办?

例如,full_namesex字段可以这样描述:

    "full_name": {
        "type": "string",
        "default": "\"John Smith\"",
        "label": "Full Name",
        "text": "Please include your full name.",
        "description": "This field will be the primary key in the database"
    },
    "sex": {
        "enum": ["m", "f"],
        "default": "m",
        "enum_labels": ["Male", "Female"],
        "label": "Sex",
        "text": "Please include your sex.",
        "description": "We want to run analytics on this field"
    }

UI团队和我可以就某些事情达成协议:

  • 如果字段属于string类型,请生成文本框。
  • 如果该字段是enum,请生成一个组合框。
  • 使用表单条目前面的字段label属性。
  • 如果该字段属于enum类型,则通过将locationinally与enum属性进行比较,为enum_labels值生成漂亮的标签。
  • 使用表单条目下方的字段text属性。
  • “描述”字段仅用于帮助您(UI人员)了解业务逻辑。

以下是这种方法的一些消极因素:

  • 以这种方式紧密耦合视图可能不是最佳的
  • 如果json-schema v5引入了我正在使用的关键字,例如text,如果我升级到v5,那么架构将会中断,然后我将不得不更改与UI团队的合同。 (为避免这种情况,还可以使用description字段来保存所有与表单相关的关键字,由某些字符分隔,但它看起来不太好。)

将json-schema与UI紧密结合是恰当的,如果是这样的话,为了实现这个目的,我为json-schema添加属性是否有任何问题?

*我偶然发现了jsonform,这正是我想要的,但这个问题仍然适用于jsonform以及自定义解析器。

1 个答案:

答案 0 :(得分:1)

可以肯定的是,您知道有一个可选的form对象用于构造表单输出?它允许自定义分组,自定义排序,条件字段等... https://github.com/joshfire/jsonform/wiki#fields

如果您的默认schema对象对于表单布局以及数据对象的存储方式都是令人满意的,那么坚持使用表单布局的架构没有任何问题。

我不确定这是否能回答你的问题,但这个问题对我来说有点不清楚。基本上是的,你可以坚持主模式,但如果这对于表单布局是不够的,你可以填充form对象。