如何更简便地将文件名作为JSON值并实现IntelliSense支持?
我想让JSON文件中tags属性的允许值是tags文件夹里的文件名(不含后缀),同时让IntelliSense能显示对应标签文件里的描述信息。举个例子:
博客文章JSON示例:
{ "title": "New Blog Post", "content": "This is the content of the blog post...", "publishedDate": "2023-08-25T15:00:00Z", "author": { "username": "authoruser", "email": "author@example.com" }, "tags": ["Technology", "Programming"] }
tags/Technology.json的内容:
{ "name": "Technology (Modern)", "description": "Posts about technology created after the year 2000" }
当前我用的方法是从标签文件生成包含anyOf的Schema,再通过$ref引用:
{ "type": "array", "items": { "anyOf": [ { "const": "Technology", "description": "Posts about technology created after the year 2000" }, { "const": "Programming", "description": "Posts about any kind of programming" } ] }, "uniqueItems": true }
文件结构如下:
posts/ blog-post-1.json blog-post-2.json ... tags/ Technology.json Programming.json Retro-Technology.json ...
最终要实现的是解析博客JSON时,能通过/tags/{tag_value}.json获取对应数据。想问除了生成anyOf数组的Schema外,有没有更简便的实现方式?
有两种更简便的方式可以实现需求:
1. 使用JSON Schema的enum结合动态生成工具(推荐)
你可以用脚本动态生成包含enum和描述信息的Schema片段,比anyOf结构更紧凑:
{ "type": "array", "items": { "type": "string", "enum": ["Technology", "Programming", "Retro-Technology"], "markdownDescription": "选择一个标签:\n- Technology: Posts about technology created after the year 2000\n- Programming: Posts about any kind of programming\n- Retro-Technology: [对应标签文件中的描述]" }, "uniqueItems": true }
脚本逻辑很简单:遍历tags文件夹下的所有JSON文件,提取文件名(去掉后缀)作为enum值,再读取每个文件里的description字段拼接成提示文本。这种方式Schema更简洁,IntelliSense同样能识别并展示提示信息。
2. 利用VS Code的自定义配置+插件(仅VS Code环境)
如果是在VS Code中开发,可以通过配置json.schemas结合插件实现快速补全:
在.vscode/settings.json中添加:
{ "json.schemas": [ { "fileMatch": ["posts/*.json"], "schema": { "type": "object", "properties": { "tags": { "type": "array", "items": { "type": "string", "description": "对应tags文件夹下的文件名(无后缀)" }, "uniqueItems": true } } } } ] }
再配合VS Code的Path Intellisense插件,配置插件识别无后缀的文件名补全,就能实现标签名的快速自动补全。不过这种方式无法直接展示标签的描述信息,适合只需要快速补全的场景。
总结
如果需要完整的描述提示,动态生成Schema仍是最优解——相比anyOf,enum结构的Schema更简洁易维护,用简单脚本就能自动生成,比手动维护高效得多。
内容的提问来源于stack exchange,提问作者SomeRandomUserIGuess

