【问题标题】:How to add JSON schema optional Enum item with default value?如何添加具有默认值的 JSON 模式可选枚举项?
【发布时间】:2015-02-07 05:46:15
【问题描述】:

我需要向 JSON 模式添加一个可选属性。 该属性是枚举类型。如果用户没有指定这个字段,我需要设置默认值。

// schema
"properties" : {
    "Param" : {
        "type" : "string",
        "enum" : [ " p1", "p2" ],
        "optional" : true,
        "default" : "p2",
        "required" : true
    }
}

如果用户不指定“Param”字段,它应该将字段识别为“p2”

【问题讨论】:

    标签: json json.net jsonschema


    【解决方案1】:

    正如您在示例中所说,“default”是一个有效的 json-schema 关键字。但它的使用取决于模式消费者。

    考虑到 json-schema 与数据结构定义和验证有关。事实上,这个关键字是在经过多次讨论后添加的,因为它非常常见,我们想向客户提示默认值应该是什么,以防他们不想设置一个。但是,同样,是否使用这个值取决于客户。

    处理您的特定情况的另一种方法是使用“oneOf”拆分枚举值。

    "required" : ["Param"],
    "oneOf" : [{
            "properties" : {
                "Param" : {
                    "enum" : ["p2"]
                }
            }
        }, {
            "properties" : {
                "Param" : {
                    "enum" : ["p1", "p3"]
                }
            }
        }
    ]
    

    在这种情况下,您是在告诉客户:“至少您必须向我发送值为“p2”的“Param”。

    最后,您还可以在服务器端添加一个预处理步骤,在该步骤中,您将所有缺少的属性都设为默认值,并在验证之前将它们添加到 json 消息中。

    【讨论】:

    • 谢谢!因为我有很多属性“OneOf”不适合我。
    • 许多具有默认值的枚举属性?然后,您唯一的选择是在客户端进行后处理步骤或在服务器中进行预处理步骤。没什么大不了的。
    【解决方案2】:

    null 添加到enum 数组中

    更多:https://json-schema.org/understanding-json-schema/reference/generic.html#enumerated-values

    "properties" : {
        "Param" : {
            "type" : "string",
            "enum" : [ " p1", "p2", null ], // <--
            "default" : "p2", // <--
            "required" : true
        }
    }
    

    【讨论】:

    • 这不是答案,它只是一个代码块。请提供一些文字来支持您的回答
    • 不幸的副作用是 null 现在是一个有效的枚举。可能不是 OP 想要的。
    【解决方案3】:

    解决方案不在模式中,而是在解析器/编译器中;传输到变量时,未指定字段的值应为 0。

    在这种情况下,它将是:

       "enum" : [ "p2", "p1" ],
    

    C 中的等价物是:

    enum {
     p2 = 0,
     p1 = 1
    }
    

    希望对您有所帮助。

    【讨论】:

      【解决方案4】:
      "properties" : {
          "Param" : {
              "type" : "string",
              "enum" : ["p1", "p2"],
              "default" : "p2"
          }
      },
      "required" : ["Param"]
      

      【讨论】:

      • 此解决方案需要 Param。 OP 希望枚举是可选的。
      猜你喜欢
      • 1970-01-01
      • 2020-03-03
      • 2022-11-21
      • 1970-01-01
      • 2013-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-27
      相关资源
      最近更新 更多