Skip to content

Commit e134477

Browse files
committed
[New] VSCode配置系统2
1 parent 21c91be commit e134477

File tree

3 files changed

+103
-86
lines changed

3 files changed

+103
-86
lines changed
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
# `IJSONSchema` 接口
2+
3+
> 参考 [JSON Schema 官方网站](https://json-schema.org/)
4+
5+
`IJSONSchema` 是 Visual Studio Code 中用于描述 JSON 数据格式的标准接口。它提供了一套规则来约束 JSON 数据的结构和内容。可以将 `schema` 理解为一组约束 JSON 数据格式的规则,这些规则被用于定义和验证传入的 JSON 数据是否符合预期格式。以下是一个简单的示例。
6+
7+
### 数据示例
8+
```typescript
9+
interface IPerson {
10+
name: string;
11+
age: number;
12+
}
13+
```
14+
15+
### `schema` 示例
16+
```typescript
17+
let personSchema: IJSONSchema = {
18+
type: 'object',
19+
properties: {
20+
name: {
21+
type: 'string',
22+
minLength: 1
23+
},
24+
age: {
25+
type: 'number',
26+
minimum: 0
27+
}
28+
},
29+
required: ['name', 'age']
30+
};
31+
```
32+
33+
### 有效数据示例
34+
```typescript
35+
let userData = {
36+
"name": "John Doe",
37+
"age": 30,
38+
"email": "john@example.com",
39+
"address": {
40+
"street": "123 Main St",
41+
"city": "Springfield",
42+
"country": "USA"
43+
},
44+
"hobbies": ["Reading", "Traveling", "Swimming"]
45+
}
46+
```
47+
48+
在 VSCode 中,`IJSONSchema` 接口的定义可以在 `vscode/src/vs/base/common/jsonSchema.ts` 文件中找到。以下是部分代码:
49+
50+
```typescript
51+
export interface IJSONSchema {
52+
id?: string;
53+
$id?: string;
54+
$schema?: string;
55+
type?: JSONSchemaType | JSONSchemaType[];
56+
title?: string;
57+
default?: any;
58+
definitions?: IJSONSchemaMap;
59+
description?: string;
60+
properties?: IJSONSchemaMap;
61+
patternProperties?: IJSONSchemaMap;
62+
additionalProperties?: boolean | IJSONSchema;
63+
minProperties?: number;
64+
maxProperties?: number;
65+
dependencies?: IJSONSchemaMap | { [prop: string]: string[]; };
66+
items?: IJSONSchema | IJSONSchema[];
67+
minItems?: number;
68+
maxItems?: number;
69+
uniqueItems?: boolean;
70+
additionalItems?: boolean | IJSONSchema;
71+
pattern?: string;
72+
minLength?: number;
73+
maxLength?: number;
74+
minimum?: number;
75+
maximum?: number;
76+
exclusiveMinimum?: boolean | number;
77+
exclusiveMaximum?: boolean | number;
78+
multipleOf?: number;
79+
required?: string[];
80+
$ref?: string;
81+
anyOf?: IJSONSchema[];
82+
allOf?: IJSONSchema[];
83+
oneOf?: IJSONSchema[];
84+
not?: IJSONSchema;
85+
}
86+
```
87+
88+
`JSONSchema` 接口的定义比较复杂,因为它整合了所有类型的属性。不同类型的数据会对应不同的属性约束:
89+
90+
-`type: 'number'` 时,`minimum``maximum` 属性用于限制数值的范围。
91+
-`type: 'string'` 时,`minLength``maxLength` 属性用于限制字符串的长度。
92+
-`type: 'array'` 时,`minItems``maxItems` 属性用于限制数组项的数量。
93+
94+
由于没有使用复杂的类型系统,VSCode 的 `IJSONSchema` 将所有的 schema 字段都放在一起,而不是基于类型进行分离。这种方式虽然使得接口定义较为简单,但也导致接口字段较为冗长。
95+
96+
### VSCode的验证过程
97+
`IJSONSchema` 接口中,虽然定义了大量的字段以方便开发者使用统一格式进行数据描述,但具体的runtime的验证过程在VSCode中我并没有找到哪里被明确规定。
98+
99+
我猜测实际的验证是由不同的组件各自负责处理的,这意味着 `IJSONSchema` 并没有提供一个集中化的验证过程,而是依赖于具体实现进行验证。
100+
101+
我唯一能找到的相关验证文件是:
102+
1. `src\vs\workbench\services\preferences\common\preferencesValidation.ts`
103+
貌似是用来验证preference configuration时会检查`IJSONSchema`和给定的数据是否匹配。
File renamed without changes.

Others/JSON Schema.md

Lines changed: 0 additions & 86 deletions
This file was deleted.

0 commit comments

Comments
 (0)