Как загрузить папку JSON в Javascript? - PullRequest
0 голосов
/ 02 июля 2019

Я хочу загрузить (потребовать) папку со схемами json, ссылки на которые основаны на их файле.

Другими словами, у меня есть

Schema1: 
{ //Schema stuff ....
    "$ref": "./json_schema2_file.json#someElement"
}

И в другом файле в той же папке:

Schema2
{//Schema stuff...
"$id": "/someElement"
}

Эти схемы находятся в отдельных файлах и теперь должны быть загружены в JS для проверки на соответствие объекту json. Тем не менее, ссылки внутри папки должны быть действительными.

Вот почему у меня возник вопрос, можно ли и как загрузить папку, полную json-файлов, без разрыва ссылок.

Эти схемы будут использоваться для проверки объектов json этой библиотекой: https://github.com/tdegrunt/jsonschema Я лично использую Node с Angular, поэтому использование fs будет работать только для узла, но будет началом.

Ответы [ 3 ]

1 голос
/ 02 июля 2019

В вашем бэкэнде Node require может использоваться для импорта файлов JSON, как если бы это был обычный файл JavaScript:

// data.json
{ "hello": "world" }

// main.js
const data = require('./data.json');
console.log(data); // { hello: 'world' }

Для вашего углового интерфейса это зависит от того, как вы строите свой пакет,но обычно использование import data from './data.json' должно дать тот же результат (как сказано в этот вопрос ).


Теперь возникает вопрос: что вы можете сделать, если ваши схемы находятся в нескольких JSONфайлы?

Собственно, ни require, ни import не требуют времени для разрешения свойств $ref и $id и для объединения всего в один объект JS.Кажется, нет простого способа разобрать все, к счастью, пакет NPM json-schema-ref-parser делает именно это!Это может быть использовано как таковое в вашем случае использования:

// foo.schema.json 
{
    "type": "object",
    "properties": {
        "bar": {
            "$ref": "./bar.schema.json"
        }
    }
}

// bar.schema.json 
{
    "type": "number"
}

// main.js 
const parser = require('json-schema-ref-parser');
parser.dereference('foo.schema.json', (err, schema) => console.log(schema));
// logs: { type: 'object', properties: { bar: { type: 'number' } } }
0 голосов
/ 02 июля 2019

Как правило, парсеры JSON Schema (включая пакет jsonschema, который я поддерживаю) не загружают ссылки автоматически.Вам просто нужно предоставить дополнительные файлы со схемами:

var Validator = require('jsonschema').Validator;
var v = new Validator();
v.addSchema(require('./json_schema.json'), 'http://example.com/json_schema.json');
v.addSchema(require('./json_schema2.json'), 'http://example.com/json_schema2.json');

Не забудьте дать вашим схемам полный URI, иначе они могут не работать согласованно между приложениями.

Еслиесли вы хотите автоматически импортировать ссылки, пакет jsonschema предоставляет список известных схем без определений в свойстве Validator#unresolvedRefs.Сдвиньте этот стек и импортируйте ссылку с помощью Validator#addSchema:

async function importUnresolved(){
    for(var uri; uri = v.unresolvedRefs.shift();){
        // where `get` is some resolver that downloads the schema
        schema = await get(uri);
        if(!schema) throw new Error(`Could not dereference JSON schema: <${uri}>`);
        v.addSchema(schema, uri);
    }
}
0 голосов
/ 02 июля 2019

1.Запишите содержимое json с использованием анализатора json, чтобы избежать опечаток.

 {
     "quiz": 
     [
         {
             "question": "Question 1",
             "a": "Answer a",
             "b": "Answer b",
             "c": "Answer c",
             "correct": "a"
         },
         {
             "question": "Question 2",
             "a": "Answer a",
             "b": "Answer b",
             "c": "Answer c",
             "correct": "b"
         },
         {
             "question": "Question 3",
             "a": "Answer a",
             "b": "Answer b",
             "c": "Answer c",
             "correct": "c"
         }
     ]
 }

2. Сохраните json в той же папке, что и ваш js-скрипт. Я назвал свой файл questions.json. 3. Загрузите данные json с помощью $ .getJSON. В следующем примере приведен полный скрипт, который загружает вопросы из json в массив allQuestions.

var allQuestions = new Array();
    
function loadQuestions() {
    $.getJSON('question.json', function (data) {
        allQuestions = data.quiz;
    }).error(function(){
            console.log('error: json not loaded');
        });
    });
}

4. Теперь ваши данные json доступны в массиве allQuestions, и вы можете получить к ним доступ, например:

var currentQuestion = allQuestions[0].question;
var answerA         = allQuestions[0].a; 

Использование обратного вызова .done Помните, что $ getJSON работает асинхронно. Такая реализация будет не лучшей идеей:

loadQuestions();
printQuestion(allQuestions[0]); 

Возможно, что к моменту вызова printQuestion JSON еще не будет загружен, а размер allQuestions будет равен 0. Чтобы убедиться, что некоторые операции выполняются после полной загрузки JSON, используйте обратный вызов .done.

var allQuestions = new Array();
    
function loadQuestions() {
    $.getJSON('question.json', function (data) {
        allQuestions = data.quiz;
    })
    .error(function() {
        console.log('error: JSON not loaded'); 
    })
    .done(function() {
        console.log( "JSON loaded!" );
        printQuestion(allQuestions[0]); 
    });
}
...