2016-08-19 6 views
1

Я обнаружил, что сегодня JSON Schema выглядит на 100% подходящим моим потребностям, но на самом деле это заставляет меня гайки с одним из самых основных случаев. Прежде чем создавать этот пост, я, очевидно, изо всех сил старался следовать существующей документации и смотрел в Интернете, пытаясь найти что-то, что помогло.JSON Схема: требуемые свойства игнорируются

Stack: PHP7 - justinrainbow/JSON-схема 2.0.5

Вот схема:

{ 
    "description":"UserCreate", 
    "type":"object", 
    "properties":{ 
     "login":{ 
     "type":"string", 
     "required":true 
     }, 
     "idAsc":{ 
     "type":"string", 
     "required":true 
     } 
    }, 
    "required":[ 
     "login", 
     "idAsc" 
    ] 
} 

Как вы можете видеть, я использую как требуемое определение (логическое и массив), просто убедитесь, что я использую хороший, я также попробовал только массив и логическое значение с тем же результатом.

Вот данные

{ 
    "login":"[email protected]" 
} 

Я ожидаю следующий код, чтобы обнаружить отсутствие требуемого параметра idAsc.

$validator = new JsonSchema\Validator; 
$validator->check($data, $schema); 
if ($validator->isValid() == false) 
    echo("Missing something"); 
else 
    echo("Good"); 

Но этот код держать печать «Хорошо» ... Я определенно не хватает кое-что о JSON Schema.

Спасибо за вашу помощь, наилучшими пожеланиями.

+0

http://json-schema.org/implementations.html списки 5 различными JSON Schema валидаторов для PHP. Какой из них вы используете? – Barmar

+0

@Barmar Вы можете найти его в разделе «Стек»: На самом деле работаем с justinrainbow/json-schema -> https://github.com/justinrainbow/json-schema –

ответ

2

Я наконец-то заработал, после отладки поэтапной реализации схемы JSON, которую я использовал:

Прежде всего, я загрузил JSON Schema себя, пример, приведенный в виде Github репо, чтобы быть разорван для меня (https://github.com/justinrainbow/json-schema):

$data = json_decode(file_get_contents('data.json')); 

// Validate 
$validator = new JsonSchema\Validator; 
$validator->check($data, (object)['$ref' => 'file://' . realpath('schema.json')]); 

Я не смог найти какой-либо призыв к file_get_contents или родственникам внутри библиотеки во время моего пошагового отладки. По этой причине я решил загрузить схему сам вместо того, чтобы дать путь к нему:

function getSchema($filePath) { 
    // NOT WORKING -> return json_decode(file_get_contents($filePath), true); 
    return json_decode(file_get_contents($filePath)); 
} 

$data = json_decode($rest->getRequest()->getBody()); 
$schema = $this->getSchema(realpath('controllers/schemas/userCreate.json')); 

$validator = new JsonSchema\Validator; 
$check_return = $validator->check($data, $schema); 

Пожалуйста, обратите внимание на комментировал линии в функции GetSchema, если вы используете json_decode с верно, как 2-й параметр, он не собирается работа либо, схема должна быть объектом, а не массивом!

Теперь все работает как шарм для меня;)

С наилучшими пожеланиями,

+1

Я решил создать билет владельцам библиотеки, чтобы получить дополнительную информацию: https://github.com/justinrainbow/json-schema/issues/299 –

0

Казалось бы, вопрос валидатора которую вы используете. Эта проверка должна завершиться неудачно. Вы можете попробовать ее с помощью других реализаций.

+0

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

+0

Что произойдет, если вы удалите свойства '" required ": true' из определений свойств? Это свойство не нарушает спецификацию схемы, но также не имеет никакого эффекта, хотя все еще вызывает неожиданное поведение для схемы impl. Я бы от него пошла. – erosb

+0

Я пробовал это еще до создания этого сообщения, но вы правы, это необходимо, чтобы не следовать v4 определения схемы JSON.Я, наконец, исправлю это, не стесняйтесь читать мое последнее сообщение, где я немного объяснил, что я сделал, чтобы заставить его работать. –

Смежные вопросы