複雑な型というのは
複数の条件すべてにマッチしなければならない
どれかにマッチすればいい(ホワイトリスト)
複数の条件のうち1つにマッチしなければならない
マッチしてはならない(ブラックリスト)
などがあります。
複数の条件すべてにマッチしなければならない
これにはallOfを使います。
{
  "allOf": [
    {
      "type": "string"
    },
    {
      "pattern": "\w+"
    }
  ]
}別れているので少しややこしいですが、以下のようにするのと同じ意味です。
{
  "type": "string",
  "pattern": "\w+"
}主に#refな条件を組み合わせる為に使ったりします。
どれかにマッチすればいい(ホワイトリスト)
これにはanyOfを使います。「ここではstringかnumberを置いてほしい」という要望なら、以下のようになります。
{
  "anyOf": [
    {
      "type": "string"
    },
    {
      "type": "number"
    }
  ]
}複数の条件のうち1つにマッチしなければならない
これにはoneOfを使います。例えば以下のようなスキーマだったとします。
{
  "oneOf": [
    {
      "type": "string"
      "pattern": "^a"
    },
    {
      "type": "string"
      "pattern": "z$"
    }
  ]
}ここにはaaやzzは置くことができますが、azは両方にマッチしてしまうので置くことができません。
マッチしてはならない(ブラックリスト)
これにはnotを使います。例えば以下のようにすると「booleanとobject、array, null以外を期待する(stringかnumber)」という意味になります。
{
  "not": [
    {
      "type": "boolean"
    },
    {
      "type": "object"
    },
    {
      "type": "array"
    },
    {
      "type": "null"
    },
  ]
}