【问题标题】:How to define JSON schema for object that holds Properties object?如何为包含 Properties 对象的对象定义 JSON 模式?
【发布时间】:2013-10-22 03:19:30
【问题描述】:

我需要为对象创建一个 JSON 模式,该模式将包含 java Properties 对象作为其属性之一。 嵌套的 Properties 对象将是 key=value 的简单列表。键和值都是字符串类型。 我找不到任何描述如何定义包含 2 种新类型的架构的文档。

应该是这样的:

{
"type": "object",
"name": "MyObj",
"properties": {
    "prop1": {
        "type": "string",
        "description": "prop1",
        "required": true
    },
    "props": {
        "type": "array",
        "items": {
            "type": "object"
            "properties": {
                "key": {
                    "type": "string",
                    "description": "key",
                    "required": true
                },
                "value": {
                    "type": "string",
                    "description": "the value",
                    "required": true
                }
            }
            "description": "the value",
            "required": true
        }
    }
}

}

【问题讨论】:

    标签: json jsonschema


    【解决方案1】:

    您编写的模式(假设逗号是固定的)描述了以下形式的数据:

    {
        "prop1": "Some string property goes here",
        "props": [
            {"key": "foo", "value": "bar"},
            {"key": "foo2", "value": "bar2"},
            ...
        ]
    }
    

    如果这是你想要的,那么你已经完成了。

    但是,我确实想知道为什么您在数组中使用键/值对,而您可以使用带有字符串键的 JSON 对象。使用 additionalProperties 关键字,您可以拥有一个架构:

    {
        "type": "object",
        "name": "MyObj",
        "properties": {
            "prop1": {
                "type": "string",
                "description": "prop1"
            },
            "props": {
                "type": "object",
                "additionalProperties": {
                    "type": "string",
                    "description": "string values"
                }
            }
        }
    }
    

    这描述了一种数据格式,如:

    {
        "prop1": "Some string property goes here",
        "props": {
            "foo": "bar",
            "foo2": "bar2"
        }
    }
    

    【讨论】:

    • 如果你想对key施加约束,你也可以使用patternProperties with additionalProperties: false。您也可以使用“模式”对值施加约束。
    【解决方案2】:

    W3 schools (JSON Syntax),您可以阅读应该如何定义数组。

    没有像 xsd for xml 这样的架构,但是我找到了一种方法 on json-schema.org。如果可以,我会建议您使用 google-GSON library for JSON。您可以将键值存储为 "id" : "value" 并仅构建一个对象,其中包含所有需要的对:

    { "lang" : "EN" , "color" : "red" }
    

    您发布的模型不正确,您可以检查它on jsonlint.com 这是一个工作版本,我不确定模型是否符合预期。

    {
        "type": "object",
        "name": "MyObj",
        "properties": [
            {
                "prop1": {
                    "type": "string",
                    "description": "prop1",
                    "required": true
                },
                "props": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "key": {
                                "type": "string",
                                "description": "key",
                                "required": true
                            },
                            "value": {
                                "type": "string",
                                "description": "the value",
                                "required": true
                            }
                        },
                        "description": "the value",
                        "required": true
                    }
                }
            }
        ]
    }
    

    【讨论】:

    • 谢谢,我修复了一些缺少的逗号,但我想我想问的是:是否有更常见的方法来在 JSON 模式中定义类似 java 属性的成员,或者我应该留在数组?
    猜你喜欢
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多