在运行时设置诊断 json 方案

Setting diagnostics json scheme in runtime

我的用例是有多种消息,为此我可以从 http 请求中获得 json 方案。

我想在收到 http 请求的响应时更新正在验证的架构。

我正在使用 angular 并发出一个 http 请求,当我获得架构时,我会执行与示例相同的代码并使用 setDiagnosticsOptions。

我现在意识到这有点需要在设置模型之前设置默认值,但我不能那样做,因为我在运行时获取模式并希望在不重新加载整个站点的情况下加载它们。

有没有人遇到过这个用例并以某种方式解决了这个问题?

您可以在加载编辑器后设置 json 默认值。 JSON 立即根据新架构进行验证。

monaco playground 上尝试此代码(只需将其粘贴并 运行)

var jsonCode = [
    '{',
    '    "p1": "v3",',
    '    "p2": false',
    "}"
].join('\n');
var modelUri = monaco.Uri.parse("a://b/foo.json"); // a made up unique URI for our model
var model = monaco.editor.createModel(jsonCode, "json", modelUri);

var schema1 = {
        uri: "http://myserver/foo-schema.json", // id of the first schema
        fileMatch: [modelUri.toString()], // associate with our model
        schema: {
            type: "object",
            properties: {
                p1: {
                    enum: ["v1", "v2"]
                }
            }
        }
    }

// configure the JSON language support with schemas and schema associations
monaco.languages.json.jsonDefaults.setDiagnosticsOptions({
    validate: true,
    schemas: [schema1]
});

monaco.editor.create(document.getElementById("container"), {
    model: model
});

// try commenting out this line to see that v3 is invalid value for a p1 property
schema1.schema.properties.p1.enum = ["v1", "v2", "v3"]

// this reloads schemas, you can add/modify and remove schemas this way
monaco.languages.json.jsonDefaults.setDiagnosticsOptions({
    validate: true,
    schemas: [schema1]
});

请注意,加载编辑器后会添加一个新的枚举值。 如果您注释掉在 运行 时间内更改模式的行,值 v3 将标记为不正确。