• 规范你的 JSON 配置,试试 JSON schema


    不知道大家在写一些 JSON 配置时会不会经常觉得麻烦,每次都要打开文档去核对字段名称对不对、结尾有没有 s、结构是否正确、是不是数组等问题。然而我最近发现一些开源项目生成的配置文件中都开始使用 JSON schema 来规范配置文件,IDE 也会对 JSON 配置进行提示和检查,真香。本文介绍下 JSON schema 的使用方法和使用场景。

    介绍

    JSON schema 是一套对 JSON 进行规范化的方案,在 JSON 文件中声明 schema 即可使用 JSON schema 检查 JSON 文件的正确性,且大部分主流 IDE 可对 JSON 文件进行属性提示、字段校验。

    使用

    JSON schema 的使用方式非常简单,只需要在 JSON 文件中添加 $schema 字段,指定 schema 文件地址即可。

    {
        "$schema": "https://json.schemastore.org/jsconfig"
    }

    添加后,IDE 或其它工具将会根据目标地址中的 schema 定义对 JSON 文件进行检查和智能提示等等。

    image.png

    如上图,会在编辑时自动提示字段名称,hover 字段名显示字段解释,类型错误的字段显示警告等等。

    除了上述使用网络地址来标识 schema 文件外,还可以使用本地文件地址,比如:


    {
        "$schema": "./my-schema.json"
    }

    schemastore

    schemastore 中存储了很多项目常用的 JSON schema,地址:https://www.schemastore.org/json/,里面包含了常见的 prettiereslintjsconfigtsconfig、各类 ci/cdlerna 等工具的配置文件,可直接引用。

    并且还提供了所有支持的清单:https://www.schemastore.org/api/json/catalog.json,开源项目可在 https://github.com/schemastore/schemastore/ 中提交自己的 schema

    当然也可以自己管理,只需提供可访问的网络地址即可。

    编写 schema

    编写 schema 其实也很简单,JSON schema 也存在几套规范,我目前能看到的包括:

    • JSON Schema Draft 4
    • JSON Schema Draft 7
    • JSON Schema Draft 8
    • JSON Schema Draft 2020-12

    上述对应的 schema 文件都可在 schemastore 中找到。

    编写时同样可指定编写文件的 $schema,注意草案 8 和 2020-12 使用到了 $recursiveRef,而 vsc 暂不支持,所以下面使用 Draft 7 规范来进行编写。

    {
        "$schema": "https://json-schema.org/draft-07/schema",
        "$id": "my-schema"
    }

    可使用 $id 来表示 schema

    编写主要使用大两个属性,一个是 properties,用于定义属性,一个是 definitions,用于定义 schema 片段(可理解为变量)。

    properties

    先看下 properties 的使用:

    {
        "properties": {
            "name": {
                "type": "string",
                "title": "this is your name"
            },
            "age": {
                "type": "number",
                "title": "this is your age"
            }
        }
    }

    上面定义了 json 中的两个属性,name 为字符串,title 为数字,title 为属性的描述,也可以使用 description

    然后我们在 json 文件中即可使用 $schema 来引用我们刚刚定义的 schema,如下:

    {
        "$schema": "my-schema.json",
        "name": "嘿嘿",
        "age": 32
    }

    definitions

    definitions 一般用于定义一些复杂类型,方便在 schema 中复用定义:

    {
        "definitions": {
            "name": {
                "type": "object",
                "properties": {
                    "firstName": {
                        "description": "First name",
                        "type": "string"
                    },
                    "lastName": {
                        "description": "Last name",
                        "type": "string"
                    },
                    "middleName": {
                        "type": "string",
                        "description": "Middle name"
                    }
                }
            }
        }
    }

    上述代码及定义里一个 name 的 schema 字段,包含 firstNamelastNamemiddleName 三个属性,然后我们需要在 properties 中引用它:

    {
        "properties": {
            "fullName": {
                "$ref": "#/definitions/name"
            }
        }
    }

    $ref 代表此处定义为引用,属性为引用的地址,# 为该 schema 文件的根,此处即为引用 definitions 中 name 的定义。

    然后我们便可在 json 文件中使用我们刚刚定义的 schema

    {
        "$schema": "my-schema.json",
        "fullName": {
            "firstName": "嘿",
            "lastName": "嘿"
        }
    }

    除了上述的属性定义等, JSON schema 还提供了其它的一些定义,如数组、数字的范围等等。

    总结

    JSON schema 可以用来规范我们的配置文件,借助 IDE 的智能提示还能降低我们编写配置文件的成本,如果存在这方面的需求,赶紧用起来吧。

    参考


    链接:https://juejin.cn/post/7129479535694708743
  • 相关阅读:
    maven/gradle 打包后自动上传到nexus仓库
    idea中怎么忽略(ignore)掉 .idea等文件
    MySQL优化一例
    微信调用照相拍照等 js 接口的权限配置 和 照片上传和下载实现
    {"errcode":40097,"errmsg":"invalid args hint: [vjNe7xxxxxx8vr19]"}——记录一次微信错误处理
    jsmooth compilation failed error null
    java.lang.UnsatisfiedLinkError: %1 不是有效的 Win32 应用程序。
    IE8 ajax缓存问题
    com.sun.xml.internal.ws.server.ServerRtException: Server Runtime Error: java.net.BindException: Cannot assign requested address: bind
    chrome 浏览器的预提取资源机制导致的一个请求发送两次的问题以及ClientAbortException异常
  • 原文地址:https://www.cnblogs.com/superfeeling/p/16727679.html
Copyright © 2020-2023  润新知