在 json 模式中,如何定义一个枚举并描述枚举中的每个元素?

Jam*_*Yan 7 enums jsonschema

在 json 模式中,我可以简单地使用“enum”和可用代码列表定义代码列表,例如:

{
  "type": "object",
  "properties": {
    "group": {
      "type":"string",  
      "$ref": "#/definitions/Group"
    }
  },

  "definitions": {
    "Group": {
      "enum": ["A","B"]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

以下有效负载将是有效的:

{
  "group": "B"
}
Run Code Online (Sandbox Code Playgroud)

但是,我尝试向用户提供架构中的描述,其中“A”=“A 组”,“B”=“B 组”。就像是:

{
  "type": "object",
  "properties": {
    "group": {
      "type":"string",  
      "$ref": "#/definitions/Group"
    }
  },

  "definitions": {
    "Group": {
      "enum": [
        {"code":"A",
         "description": "Group A"
        },
        {"code":"B",
         "description": "Group B"
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但我不想改变有效负载的结构(不需要“描述”字段)描述更多的是用于用户可以参考的文档目的。这里有可以使用的好做法吗?

谢谢

Jas*_*ers 4

您可以使用anyOfwithconst来代替enum. 然后您可以使用titledescription作为文档。

{
  "anyOf": [
    {
      "const": "A",
      "title": "Group A"
    },
    {
      "const": "B",
      "title": "Group B"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,“anyOf”是更好的选择,因为它更高效。“oneOf”的意思是唯一的。如果正在验证的值为“A”,则“anyOf”可以在检查第一个选项后停止评估。“oneOf”需要评估每个选项,以确保其他选项都不匹配。由于这些选项都是互斥的,因此“oneOf”会做一堆不必要的工作。 (3认同)
  • “anyOf”或“oneOf”。我建议使用“oneOf”,因为这些字符串中只有一个可以匹配该值。但从实践的角度来看,这些对于这个目的来说是等效的。 (2认同)