当前位置: 首页 > 知识库问答 >
问题:

如何将json文件夹加载到JavaScript中?

仲俊豪
2023-03-14

我想加载(要求)一个包含json模式的文件夹,这些模式具有基于其文件的引用。

换句话说,我有

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

并在同一文件夹中的另一个文件中:

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

这些模式在sperate文件中,现在应该加载到JS中,以便针对json对象进行验证。但是,文件夹内的引用应该仍然有效。

这就是为什么我的问题是,是否以及如何能够加载一个装满json文件的文件夹,而不需要中断引用。

这个库将使用这些模式来验证json对象:https://github.com/tdegrunt/jsonSchema我个人将Node与Angular一起使用,所以使用fs只对Node起作用,但这将是一个开始。

共有2个答案

邢飞鸿
2023-03-14

通常,JSON模式解析器(包括我维护的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属性中没有定义。移除此堆栈并使用验证器#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);
    }
}
姚正真
2023-03-14

在节点后端,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文件中,您能做什么?

从本机来说,requireimport都不会花时间解析$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' } } }
 类似资料:
  • 问题内容: 有人可以为我提供导入整个模块目录的好方法吗? 我有这样的结构: 我尝试通过添加和执行操作将其转换为程序包,但它没有按我希望的方式工作。 问题答案: 列出当前文件夹中的所有文件,并将它们作为变量放入

  • 问题内容: 我正在使用Selenium WebDriver尝试将外部javascript文件插入DOM中,而不是将整个内容键入到executeScript中。 看起来好像已将节点正确放置到DOM中,但是随后它只是忽略了源代码,即,所述源js文件上的函数未运行。 这是我的代码: 我链接到的javascript文件的代码是 我已将js文件放在本地主机上,使用file:///进行了调用,并在外部服务器上

  • 我使用Selenium WebDriver尝试将外部javascript文件插入到DOM中,而不是将整个文件输入到Executescript中。 它看起来像是正确地将节点放入了DOM,但它只是忽略了源,即源js文件上的函数不运行。 下面是我的代码: 我链接到的javascript文件的代码是 我将js文件放在本地主机上,使用file:///调用它,并在外部服务器上进行了尝试。没有骰子。 我还尝试了

  • 问题内容: Eclipse设置为在“ bin”处编译为构建目录。我有一个包含各种Java .class文件(预编译)的文件夹结构,我想在编译时将其复制到文件夹“ bin”中。 如何告诉Eclipse自动执行此操作? 问题答案: 项目属性中“ Java构建路径”下的“添加类文件夹…”和“添加外部类文件夹…”按钮似乎完全可以满足您的要求。

  • 我想把一个html文件加载到WebView中。 请注意,在so上有很多相关的问题,但它们都涉及从资产文件夹获取**.html*。 但是我想从本地文件夹加载html文件,比如“d://abc.html”,因为如果我的html大约是10MB,那么相应的apk大小也会增加到10MB。

  • 问题内容: 我试图用BottlePy返回一个html模板。这很好。但是,如果我在tpl文件中插入这样的javascript文件: 我收到404错误。 (无法加载资源:服务器响应状态为404(未找到)) 有谁知道如何解决这个问题? 这是我的脚本文件: 那就是模板文件,位于“ ./views”子文件夹中。 也许是开发服务器在其中查找我的js文件的“ rootPath / js / main.js”?