{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "schema:ItemList",
  "title": "ItemList",
  "description": "A list of items of any sort—for example, Top 10 Movies About Weathermen, or Top 100 Party Songs. Not to be confused with HTML lists, which are often used only for formatting.",
  "type": "object",
  "allOf": [
    {
      "description": "A utility class that serves as the umbrella for a number of 'intangible' things such as quantities, structured values, etc.",
      "$ref": "schema:Intangible"
    }
  ],
  "properties": {
    "aggregateElement": {
      "description": "Indicates a prototype of the elements in the list that is used to hold aggregate information (ratings, offers, etc.).",
      "oneOf": [
        { "$ref": "schema:Thing" },
        { "type": "array", "items": { "$ref": "schema:Thing" } }
      ]
    },
    "itemListElement": {
      "description": "For itemListElement values, you can use simple strings (e.g. \"Peter\", \"Paul\", \"Mary\"), existing entities, or use ListItem.\\n\\nText values are best if the elements in the list are plain strings. Existing entities are best for a simple, unordered list of existing things in your data. ListItem is used with ordered lists when you want to provide additional context about the element in that list or when the same item might be in different places in different lists.\\n\\nNote: The order of elements in your mark-up is not sufficient for indicating the order or elements.  Use ListItem with a 'position' property in such cases.",
      "oneOf": [
        {
          "anyOf": [
            { "type": "string" },
            { "$ref": "schema:ListItem" },
            { "$ref": "schema:Thing" }
          ]
        },
        {
          "type": "array",
          "items": {
            "anyOf": [
              { "type": "string" },
              { "$ref": "schema:ListItem" },
              { "$ref": "schema:Thing" }
            ]
          }
        }
      ]
    },
    "itemListOrder": {
      "description": "Type of ordering (e.g. Ascending, Descending, Unordered).",
      "anyOf": [{ "type": "string" }, { "$ref": "schema:ItemListOrderType" }]
    },
    "numberOfItems": {
      "description": "The number of items in an ItemList. Note that some descriptions might not fully describe all items in a list (e.g., multi-page pagination); in such cases, the numberOfItems would be for the entire list.",
      "type": "integer"
    }
  }
}
