You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Monaco编辑器中移除JSON的$schema自动补全选项

解决Monaco Editor JSON模式下移除$schema自动补全选项的问题

我之前做JSON编辑UI时也碰到过这个烦人的$schema自动补全,折腾了几次终于找到可行方案,分两种场景给你说明:

方法一:全局禁用Schema相关补全(简单直接)

如果完全不需要任何schema相关提示,一行代码就能搞定,直接通过Monaco的JSON默认配置关闭:

// 关闭JSON Schema的补全建议
monaco.languages.json.jsonDefaults.setOptions({
  suggest: {
    schemaSuggestions: false
  }
});

这个配置会直接关掉所有和schema相关的自动补全(包括$schema选项),同时不会影响你自己的自定义补全功能。

方法二:精细过滤$schema选项(保留其他默认补全)

如果你还想保留JSON默认的语法补全(比如对象、数组的结构提示),只是单独去掉$schema,可以通过自定义Completion Item Provider实现。核心思路是先获取默认补全列表,过滤掉$schema后再合并自己的自定义补全:

monaco.languages.registerCompletionItemProvider('json', {
  // 和JSON默认触发补全的字符保持一致
  triggerCharacters: ['"', ':'],
  async provideCompletionItems(model, position) {
    // 获取JSON默认的补全提供者
    const defaultProvider = monaco.languages.json.jsonDefaults.completionItemProvider;
    // 获取默认补全列表
    const defaultCompletions = await defaultProvider.provideCompletionItems(model, position);
    
    // 过滤掉label为$schema的补全项
    const filteredDefaultItems = defaultCompletions.items.filter(item => item.label !== '$schema');
    
    // 这里添加你的自定义补全项,示例如下
    const customCompletions = [
      {
        label: 'myCustomKey',
        kind: monaco.languages.CompletionItemKind.Property,
        insertText: '"myCustomKey": "$1"',
        insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
        documentation: '这是我的自定义配置项'
      }
    ];
    
    // 返回合并后的补全列表
    return {
      items: [...filteredDefaultItems, ...customCompletions]
    };
  }
}, {
  // 设置优先级高于默认提供者,确保过滤逻辑生效
  priority: 1
});

这里要注意设置priority: 1,让自定义提供者的优先级高于默认的,这样我们的过滤逻辑才能覆盖默认的补全结果。

为什么之前的completionProvider没生效?

大概率是两个原因:要么直接注册自定义提供者时完全覆盖了默认补全,要么优先级设置低于默认导致$schema还是会显示。上面的方法既保留了有用的默认补全,又去掉了不需要的$schema,同时能正常加入自定义内容,应该能解决你的问题。

内容的提问来源于stack exchange,提问作者Tim Perry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:27:37