Использование ref в JSON Schema для ссылки на локальную схему на диске

У меня есть файл схемы JSON:

{  
   "id":"http://schema.acme.com/user",
   "$schema":"http://json-schema.org/draft-06/schema#",
   "definitions":{  
      "user":{  
         "description":"The name the user has selected",
         "type":"object",
         "required":[  
            "username",
            "premium"
         ],
         "properties":{  
            "username":{  
               "type":"string",
               "maxLength":10,
               "minLength":1
            },
            "premium":{  
               "type":"boolean"
            }
         }
      }
   }
}

и я хочу проверить это в отношении объекта JSON. Поэтому я создаю временный объект этого типа с этой схемой:

{  
   "id":"http://schema.acme.com/uName",
   "$schema":"http://json-schema.org/draft-06/schema#",
   "properties":{  
      "uName":{  
         "$ref":"smUserSchema.json#/definitions/user"
      }
   },
   "required":[  
      "uName"
   ]
}

и у меня есть этот файл данных JSON:

{  
   "uName":{  
      "username":"Bob",
      "premium":true
   }
}

Цель здесь состоит в том, чтобы не вставлять мой временный объект в мою схему JSON для типа класса. (И да, одна из моих проблем заключается в том, что я пытаюсь использовать ОО-методы в JSON. Это правда, я просто делаю это по причинам повторного использования и наследования, возможно, есть лучший способ.)

Когда я иду, чтобы проверить это, я получаю эту ошибку:

$ ajv -s uNameSchema.json -d validUser.json 
schema uNameSchema.json is invalid
error: can't resolve reference smUserSchema.json#/definitions/user from id http://schema.acme.com/uName#

Как включить схему JSON в другую схему?

Смотрите также:

2 ответа

Вы должны убедиться, что AJV знает smUserSchema.json, он не найдет его автоматически. Есть опция командной строки для передачи зависимых схем, но я не могу вспомнить ее случайно. ajv --help должен сказать вам (у меня его нет в наличии).

Вы установили схему, на которую хотите сослаться http://schema.acme.com/user.

Однако вы используете относительную ссылку smUserSchema.json#/definitions/user, который решает http://schema.acme.com/smUserSchema.json#/definitions/user.

Вам нужно изменить либо $idопределенный в схеме, на которую указывает ссылка, или относительный URI, используемый для $ref, чтобы они совпадали.

Я понимаю, что этот ответ немного запоздал, и я надеюсь, что вы решили свою проблему раньше, но он все еще может быть полезен для других.

Другие вопросы по тегам