При разборе схемы json с несколькими ссылками в свойстве anyOf в выходных данных возвращается только одна ссылка (последняя) - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть действующая схема json, как показано ниже

 {
      "$schema": "http://json-schema.org/draft-07/schema#",
      "$id": "abcd",
      "title": "test schema",
      "description": "............",
      "type": "object",
      "properties": {
         "a": {
           ...........
           ...........
          },
         "b": {
          .........
          ........
          .........
          },
         "c": {
          ...........
          ..........
          },
         "d": {
          ...........
          ..........
          }
       },
    "anyOf": [
        {
        "type": "object",
              "$ref": "#/properties/a",
              "$ref": "#/properties/b"
        },
            {
             "type": "object",
              "$ref": "#/properties/c",
              "$ref": "#/properties/d"
            }
        ]

    }

Схема выше хранится в файле, и я загружаю ее для анализа, который можно увидеть ниже

JSchema schema =
    JSchema.Parse(File.ReadAllText(@"D:\Backups\testschema.json"));

Итак, когда я смотрю на вывод схемы, он выглядит следующим образом:

My Json Schema
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "abcd",
  "title": "test schema",
  "description": "............",
  "type": "object",
  "properties": {
     "a": {
       ...........
       ...........
      },
     "b": {
      .........
      ........
      .........
      },
     "c": {
      ...........
      ..........
      },
     "d": {
      ...........
      ..........
      }
   },
"anyOf": [
    {
          "$ref": "#/properties/b"
    },
        {
          "$ref": "#/properties/d"
        }
    ]

}

I'm wondering why I'm getting only the last reference under the anyOf property

On parsing shouldn't the output be the same as that in the file?
Am I missing something?
My desired output under anyOf is 

"anyOf": [
    {
    "type": "object",
          "$ref": "#/properties/a",
          "$ref": "#/properties/b"
    },
        {
         "type": "object",
          "$ref": "#/properties/c",
          "$ref": "#/properties/d"
        }
    ]

Есть мысли о том, как мне достичь желаемого результата?

1 Ответ

1 голос
/ 02 апреля 2019

В Json каждый объект может иметь определенный ключ только один раз. Таким образом, внутри одного объекта вы можете иметь только один ключ с именем $ref. Json, который вы разместили выше, недействителен; реализация зависит от того, что она делает - в идеале она должна выдавать ошибку, но в этом случае похоже, что вторая перезаписывает первую.

Обратите внимание, что при $ref другие свойства игнорируются, поэтому нет смысла использовать другое ключевое слово, например type, в дополнение к $ref.

Я не совсем уверен, но похоже, что вы пытаетесь достичь, это сказать, что должны присутствовать либо свойства "a" и "b", либо свойства "c" и "d" .

Этого можно добиться, заменив предложение anyOf на:

"anyOf": [
    {
        "required": ["a", "b"]
    },
    {
        "required": ["c", "d"]
    }
]
...