Javascript JSON模式:表示将对象类型编码为字符串类型的约束

Javascript JSON模式:表示将对象类型编码为字符串类型的约束,javascript,json,schema,schema-design,jsonschema,Javascript,Json,Schema,Schema Design,Jsonschema,在JSON序列化数据中,我有嵌套对象: { "A" : { "A1": 1, "A2": 2 }, "B" : { "B1": 3, "B2": 4 } } 由于我无法影响给定的约束,我需要将结构展平。这意味着,深度大于1的每个对象都必须编码为字符串。应用于上述示例,如下所示: { "A" : "\{\"A1\": 1, \"A2\": 2\}" "B" : "\{\"B1\": 3, \"B2\": 4\}" } 因为我需要在中表

在JSON序列化数据中,我有嵌套对象:

{
  "A" : { "A1": 1,
          "A2": 2 },
  "B" : { "B1": 3,
          "B2": 4 }
}
由于我无法影响给定的约束,我需要将结构展平。这意味着,深度大于1的每个对象都必须编码为字符串。应用于上述示例,如下所示:

{
  "A" : "\{\"A1\": 1, \"A2\": 2\}"
  "B" : "\{\"B1\": 3, \"B2\": 4\}"  
}
因为我需要在中表达这个约束,所以我几乎受制于它的语法规则。我猜这些对象的类型将是
string
object

{
  "title": "My Schema",
  "type": "object",
  "properties": {

    "A": {
      "type": "string vs. object" 
    "B": {
      "type": "string vs. object"
}

我同意,您可以选择
对象
字符串
类型。我已经研究了这个问题,但我找不到任何东西来表达所需的约束。因此,我对这两种方法进行了简短的讨论

键入字符串

JSON模式定义了七种基本类型,包括对象。字符串仅定义为JSON字符串。RFC4627定义了一个JSON字符串,如下所示

字符串是零个或多个Unicode字符的序列

这将适用于您的情况,即使字符串的内容必须受到限制。问题是如何传达限制。我将使用
描述
引用另一个子模式。您甚至可以为字符串定义
模式
,并将子模式编码为正则表达式。然而,这将是非常容易出错的,并且根本不是人类可读的。然而,它可以用于更好的数据模式验证

{
  "title": "My Schema",
  "type": "object",
  "properties": {

    "A": {
      "type": "string".
      "description": "Please refer to http://... for the subschema."
    },
    "B": {
      "type": "string"
      "description": "Please refer to http://... for the subschema."
    }
}
这样做的好处是,JSON提供程序必须将字符串放入该属性中,这一点是显而易见的。缺点是完整的模式不能一次查看,描述可能会被监督,而且在查找过程中也很麻烦。最后,当看到类型
string
时会非常混乱,但子模式中定义了
对象

类型对象

通过简单地按原样使用类型,可以避免使用字符串的所有缺点。这里真正的问题是,说明is必须是字符串编码的描述将被忽略

{
  "title": "My Schema",
  "type": "object",
  "properties": {

    "A": {
      "description": "Must be encoded as string",
      "type": "object",
      "properties": { "A1": { "type": "string" }, "A2": { "type": "string" } }
    },
    "B": {
      "description": "Must be encoded as string",
      "type": "object"
      "properties": { "A1": { "type": "string" }, "A2": { "type": "string" } }
    }
}
您总是可以制造一些完全虚假的东西,比如使用类型
字符串
并为其定义
属性
,但这将是无效的JSON模式


我建议您使用类型对象方法。尽管存在此约束,但使用字符串类型始终会导致其背后的数据降级。可以通过其他方式强制约束,以避免出现错误。观察谁提供数据,向各方传达约束,阻止与该约束相关的无效数据等


谁知道呢,也许这个约束不会永远存在,如果它改变了,你需要再次改变模式。在另一种情况下,你只需要删除说明字符串编码要求的注释。

我同意,要么你选择
对象
或者
字符串
类型。我已经研究了这个问题,但我找不到任何东西来表达所需的约束。因此,我对这两种方法进行了简短的讨论

键入字符串

JSON模式定义了七种基本类型,包括对象。字符串仅定义为JSON字符串。RFC4627定义了一个JSON字符串,如下所示

字符串是零个或多个Unicode字符的序列

这将适用于您的情况,即使字符串的内容必须受到限制。问题是如何传达限制。我将使用
描述
引用另一个子模式。您甚至可以为字符串定义
模式
,并将子模式编码为正则表达式。然而,这将是非常容易出错的,并且根本不是人类可读的。然而,它可以用于更好的数据模式验证

{
  "title": "My Schema",
  "type": "object",
  "properties": {

    "A": {
      "type": "string".
      "description": "Please refer to http://... for the subschema."
    },
    "B": {
      "type": "string"
      "description": "Please refer to http://... for the subschema."
    }
}
这样做的好处是,JSON提供程序必须将字符串放入该属性中,这一点是显而易见的。缺点是完整的模式不能一次查看,描述可能会被监督,而且在查找过程中也很麻烦。最后,当看到类型
string
时会非常混乱,但子模式中定义了
对象

类型对象

通过简单地按原样使用类型,可以避免使用字符串的所有缺点。这里真正的问题是,说明is必须是字符串编码的描述将被忽略

{
  "title": "My Schema",
  "type": "object",
  "properties": {

    "A": {
      "description": "Must be encoded as string",
      "type": "object",
      "properties": { "A1": { "type": "string" }, "A2": { "type": "string" } }
    },
    "B": {
      "description": "Must be encoded as string",
      "type": "object"
      "properties": { "A1": { "type": "string" }, "A2": { "type": "string" } }
    }
}
您总是可以制造一些完全虚假的东西,比如使用类型
字符串
并为其定义
属性
,但这将是无效的JSON模式


我建议您使用类型对象方法。尽管存在此约束,但使用字符串类型始终会导致其背后的数据降级。可以通过其他方式强制约束,以避免出现错误。观察谁提供数据,向各方传达约束,阻止与该约束相关的无效数据等


谁知道呢,也许这个约束不会永远存在,如果它改变了,你需要再次改变模式。在另一种情况下,你只需要删除说明字符串编码要求的注释。

我知道你已经选择了一个答案,但我想我只需要在这里提到工作原理

JSON模式试图避免进行“语义”验证——这意味着对标量类型内的数据进行验证(例如强制执行字符串格式或数字精度)

如果您想要像这样记录字符串值的内部格式,您可以使用
“format”
值(可能是自定义值,因为标准中没有合适的值)

。。。或者您可以使用
“媒体”
。这个schema关键字的值是一个对象,它可以