首页 > 解决方案 > 如何在嵌套对象/数组数据结构的任何级别定义确切的数据类型?

问题描述

我正在尝试定义一个“复杂”对象:

var tM = JSON.parse('{"version":"","series":[{"name":"","possModes":[],"instance":[{"date":"","mode":""}]}]}');

其中数组“实例”的所有项目都应该是类型的对象

{"date":"","mode":""}

并且数组“系列”的所有项目都应该是类型的对象

{"name":"","possModes":[],"instance":[{"date":"","mode":""}]}

问题是只有索引 [0] 的项目获得了正确的属性,而更高索引的项目是“未定义的”,所以我无法将它们设置为所需的值。

我也尝试过tM明确定义,例如:

var Cinstance = new Object();
Cinstance.date = "";
Cinstance.mode = "";

var Cseries = new Object();
Cseries.name = '';
Cseries.possModes = [];
Cseries.instance = [new Object(Cinstance)];

var tM= new Object();
tM.version = "";
tM.series = [new Object(Cseries)];

并且还喜欢:

var tM = {series:
           [{instance:
              [{date:"",mode:""}
              ]
            }
           ]
         }

(这是一个简化为我的具体问题的版本)。

当然,它们最终都会得到相同的结果——只定义了索引 [0] 的项目。

标签: javascriptarraysjsonobjecttypes

解决方案


OP提供的数据结构...

{
  "version": "",
  "series": [{

    "name": "",
    "possModes": [],
    "instance": [{

      "date": "",
      "mode": ""
    }]
  }]
}

...确实针对以下JSON 模式进行验证...

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "My-Special-Schema-Or-Data-Structure-Title",
  "description": "Whatever I have to say about my described structure",
  "type": "object",
  "properties": {
    "version": {
      "description": " ... ",
      "type": "string"
    },
    "series": {
      "description": " ... ",
      "type": "array",
      "minItems": 1,
      "items": {
        "description": " ... ",
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "possModes": {
            "description": " ... ",
            "type": "array"
          },
          "instance": {
            "description": " ... ",
            "type": "array",
            "minItems": 1,
            "items": {
              "description": " ... ",
              "type": "object",
              "properties": {
                "date": {
                  "type": "string"
                },
                "mode": {
                  "type": "string"
                }
              },
              "required": [
                "date",
                "mode"
              ]
            }
          }
        },
        "required": [
          "name",
          "possModes",
          "instance"
        ]
      }
    }
  },
  "required": [
    "version",
    "series"
  ]
}

甚至可以从一个JSON Schema Generator开始。通过 OP 最初提供的数据结构,得到一个 JSON Schema 的坚实基础,然后可以继续剪裁。


推荐阅读