【问题标题】:How to manage multiple JSON schema files?如何管理多个 JSON 模式文件?
【发布时间】:2012-01-01 00:33:27
【问题描述】:

我正在尝试使用来自 commonjs-utils 的 node.js + json-schema.js 验证我的 JSON API。单次验证很容易,但找不到正确的方法来管理多个架构文件以实现相互引用。

假设我有两个模型和两个 API。

// book
{
  "type": "object",
  "properties": {
      "title": { "type": "string" },
      "author": { "type": "string" }
  }
}
// author
{
  "type": "object",
  "properties": {
      "first_name": { "type": "string" },
      "last_name": { "type": "string" }
  }
}  
// authors API
{
  "type": "array",
  "items": { "$ref": "author" }
}
// books API: list of books written by same author
{
  "type": "object",
  "properties": {
    "author": { "$ref": "author" } 
    "books": { "type": "array", "items": { "$ref": "book" } }
  }
}  

每个架构都应该分成单独的文件并在线吗?或者我可以像下面这样组合成单个模式文件吗?如果可能,我如何引用本地架构?

// single schema file {
    "book": { ... },
    "author": { ... },
    "authors": { ... },
    "books": { ... } }

【问题讨论】:

    标签: json node.js schema jsonschema


    【解决方案1】:

    在 JSON 模式中,您可以为每个文件放置一个模式,然后使用它们的 URL(存储它们的位置)或带有 id 标记的大模式访问它们。

    这是一个大文件:

    {
        "id": "#root",
        "properties": {
            "author": {
                "id": "#author",
                "properties": {
                    "first_name": {
                        "type": "string"
                    },
                    "last_name": {
                        "type": "string"
                    }
                },
                "type": "object"
            },
            // author
            "author_api": {
                "id": "#author_api",
                "items": {
                    "$ref": "author"
                },
                "type": "array"
            },
            // authors API
            "book": {
                "id": "#book",
                "properties": {
                    "author": {
                        "type": "string"
                    },
                    "title": {
                        "type": "string"
                    }
                },
                "type": "object"
            },
            // books API: list of books written by same author
            "books_api": {
                "id": "#books_api",
                "properties": {
                    "author": {
                        "$ref": "author"
                    },
                    "books": {
                        "items": {
                            "$ref": "book"
                        },
                        "type": "array"
                    }
                },
                "type": "object"
            }
        }
    }
    

    然后您可以将您的验证器引用到这些子架构之一(使用id 定义)。

    在你的架构之外,这个:

    { "$ref": "url://to/your/schema#root/properties/book" }
    

    等价于:

    { "$ref": "url://to/your/schema#book" }
    

    ... 从内部看,这相当于:

    { "$ref": "#root/properties/book" }
    

    或者这个(仍然来自内部):

    { "$ref": "#book" }
    

    请查看我的answer here 了解更多信息。

    【讨论】:

    • 有什么方法可以在 node.js 中创建具有分离架构文件的对象?
    • @uzay95 模式不是类。模式用于定义和验证对象的结构,类在对象初始化后定义对象的结构。如果您需要 js 中的类,请尝试查看 Typescript、AtScript 或 ES6。或者简单地将模块或构造函数工厂方法放在您将包含在 node.js 中的外部文件中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2019-03-30
    • 2015-01-19
    相关资源
    最近更新 更多