用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/microwind/ai-skills --skill json命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | JSON验证器 |
| description | 当验证JSON文件、检查语法、调试JSON错误或格式化JSON时,在无效JSON到达下游之前捕获错误。 |
| license | MIT |
JSON无处不在 - 配置文件、API、数据存储。无效的JSON会静默破坏系统。在它们到达生产环境之前捕获错误。
核心原则: 尽早验证,经常验证。源头的无效JSON是你代码中的错误。
始终:
触发短语:
问题:
JSON语法不正确
错误示例:
{
"name": "John",
"age": 30, ← 末尾多余的逗号
"city": "New York"
}
解决方案:
移除最后一个属性后的逗号
{
"name": "John",
"age": 30,
"city": "New York"
}
问题:
引号使用不正确
错误示例:
{
name: "John", ← 键名需要引号
"message": 'Hello' ← 值必须使用双引号
}
解决方案:
所有键名和字符串值都必须使用双引号
{
"name": "John",
"message": "Hello"
}
问题:
数据类型不匹配
错误示例:
{
"count": "100", ← 应该是数字
"active": "true", ← 应该是布尔值
"items": null ← 不应该是null
}
解决方案:
使用正确的JSON数据类型
{
"count": 100,
"active": true,
"items": []
}
import json
import re
from typing import Dict, List, Any, Optional, Union
from dataclasses import dataclass
from enum import Enum
import jsonschema
class ValidationLevel(Enum):
ERROR = "error"
WARNING = "warning"
INFO = "info"
@dataclass
class ValidationResult:
"""验证结果"""
level: ValidationLevel
message: str
line: Optional[int] = None
column: Optional[int] = None
path: Optional[str] = None
suggestion: Optional[str] = None
@dataclass
class JSONDocument:
"""JSON文档"""
content: Dict[str, Any]
raw_text: str
encoding: str
metadata: Dict[str, Any]
class JSONValidator:
"""JSON验证器"""
():
.validation_rules = ._initialize_validation_rules()
.json_schemas = {}
() -> [ValidationResult]:
:
(file_path, , encoding=) f:
content = f.read()
Exception e:
[ValidationResult(
level=ValidationLevel.ERROR,
message=
)]
.validate_json_content(content, schema)
() -> [ValidationResult]:
results = []
syntax_results = ._validate_syntax(content)
results.extend(syntax_results)
(r.level == ValidationLevel.ERROR r syntax_results):
results
:
json_data = json.loads(content)
structure_results = ._validate_structure(json_data)
results.extend(structure_results)
schema:
schema_results = ._validate_schema(json_data, schema)
results.extend(schema_results)
semantic_results = ._validate_semantics(json_data)
results.extend(semantic_results)
performance_results = ._check_performance(json_data)
results.extend(performance_results)
json.JSONDecodeError e:
results.append(ValidationResult(
level=ValidationLevel.ERROR,
message=,
line=(e, , ),
column=(e, , )
))
results
() -> [ValidationResult]:
results = []
lines = content.split()
line_num, line (lines, ):
re.search(, line):
results.append(ValidationResult(
level=ValidationLevel.ERROR,
message=,
line=line_num,
column=line.find() + ,
suggestion=
))
re.search(, line):
= re.search(, line)
line.strip().startswith():
results.append(ValidationResult(
level=ValidationLevel.ERROR,
message=,
line=line_num,
column=line.find(.group()) + ,
suggestion=
))
line line.strip().startswith():
results.append(ValidationResult(
level=ValidationLevel.ERROR,
message=,
line=line_num,
column=line.find() + ,
suggestion=
))
line.strip() line.strip().startswith():
results.append(ValidationResult(
level=ValidationLevel.WARNING,
message=,
line=line_num,
column=line.find() + ,
suggestion=
))
results
() -> [ValidationResult]:
results = []
._check_data_types(json_data, , results)
max_depth = ._calculate_depth(json_data)
max_depth > :
results.append(ValidationResult(
level=ValidationLevel.WARNING,
message=,
suggestion=
))
._check_array_sizes(json_data, , results)
._check_object_keys(json_data, , results)
results
():
(data, ):
key, value data.items():
current_path = path key
(key, ):
results.append(ValidationResult(
level=ValidationLevel.ERROR,
message=,
path=current_path
))
._check_data_types(value, current_path, results)
(data, ):
i, item (data):
current_path = path
._check_data_types(item, current_path, results)
() -> :
(data, ):
data:
current_depth
(._calculate_depth(value, current_depth + ) value data.values())
(data, ):
data:
current_depth
(._calculate_depth(item, current_depth + ) item data)
:
current_depth
():
(data, ):
key, value data.items():
current_path = path key
._check_array_sizes(value, current_path, results)
(data, ):
(data) > :
results.append(ValidationResult(
level=ValidationLevel.WARNING,
message=,
path=path,
suggestion=
))
i, item (data):
current_path = path
._check_array_sizes(item, current_path, results)
():
(data, ):
keys = (data.keys())
unique_keys = (keys)
(keys) != (unique_keys):
results.append(ValidationResult(
level=ValidationLevel.WARNING,
message=,
path=path,
suggestion=
))
key keys:
re.(, key):
results.append(ValidationResult(
level=ValidationLevel.INFO,
message=,
path= path key,
suggestion=
))
key, value data.items():
current_path = path key
._check_object_keys(value, current_path, results)
(data, ):
i, item (data):
current_path = path
._check_object_keys(item, current_path, results)
() -> [ValidationResult]:
results = []
:
jsonschema.validate(json_data, schema)
jsonschema.ValidationError e:
results.append(ValidationResult(
level=ValidationLevel.ERROR,
message=,
path=.join((p) p e.absolute_path) e.absolute_path ,
suggestion=
))
jsonschema.SchemaError e:
results.append(ValidationResult(
level=ValidationLevel.ERROR,
message=,
suggestion=
))
results
() -> [ValidationResult]:
results = []
._check_null_values(json_data, , results)
._check_empty_strings(json_data, , results)
._check_numeric_ranges(json_data, , results)
._check_date_formats(json_data, , results)
results
():
(data, ):
key, value data.items():
current_path = path key
value :
results.append(ValidationResult(
level=ValidationLevel.WARNING,
message=,
path=current_path,
suggestion=
))
._check_null_values(value, current_path, results)
(data, ):
i, item (data):
current_path = path
._check_null_values(item, current_path, results)
():
(data, ):
key, value data.items():
current_path = path key
value == :
results.append(ValidationResult(
level=ValidationLevel.INFO,
message=,
path=current_path,
suggestion=
))
._check_empty_strings(value, current_path, results)
(data, ):
i, item (data):
current_path = path
._check_empty_strings(item, current_path, results)
():
(data, ):
key, value data.items():
current_path = path key
key.lower() (value, (, )):
value < value > :
results.append(ValidationResult(
level=ValidationLevel.WARNING,
message=,
path=current_path,
suggestion=
))
key.lower() (value, (, )):
value < :
results.append(ValidationResult(
level=ValidationLevel.WARNING,
message=,
path=current_path,
suggestion=
))
._check_numeric_ranges(value, current_path, results)
(data, ):
i, item (data):
current_path = path
._check_numeric_ranges(item, current_path, results)
():
date_patterns = [
,
,
,
]
(data, ):
key, value data.items():
current_path = path key
key.lower() (value, ):
(re.(pattern, value) pattern date_patterns):
results.append(ValidationResult(
level=ValidationLevel.WARNING,
message=,
path=current_path,
suggestion=
))
._check_date_formats(value, current_path, results)
(data, ):
i, item (data):
current_path = path
._check_date_formats(item, current_path, results)
() -> [ValidationResult]:
results = []
json_str = json.dumps(json_data, ensure_ascii=)
size_bytes = (json_str.encode())
size_mb = size_bytes / ( * )
size_mb > :
results.append(ValidationResult(
level=ValidationLevel.WARNING,
message=,
suggestion=
))
._check_string_lengths(json_data, , results)
results
():
(data, ):
key, value data.items():
current_path = path key
._check_string_lengths(value, current_path, results)
(data, ):
i, item (data):
current_path = path
._check_string_lengths(item, current_path, results)
(data, ):
(data) > :
results.append(ValidationResult(
level=ValidationLevel.INFO,
message=,
path=path,
suggestion=
))
() -> [, ]:
{
: ,
: ,
: ,
:
}
() -> :
results:
report = []
by_level = {
ValidationLevel.ERROR: [],
ValidationLevel.WARNING: [],
ValidationLevel.INFO: []
}
result results:
by_level[result.level].append(result)
level [ValidationLevel.ERROR, ValidationLevel.WARNING, ValidationLevel.INFO]:
by_level[level]:
level_name = level.value.upper()
report.append()
result by_level[level]:
location =
result.line:
location =
result.column:
location +=
location +=
result.path:
location =
report.append()
result.suggestion:
report.append()
report.append()
error_count = (by_level[ValidationLevel.ERROR])
warning_count = (by_level[ValidationLevel.WARNING])
info_count = (by_level[ValidationLevel.INFO])
summary =
error_count > :
summary +=
warning_count > :
summary +=
:
summary +=
report.append(summary)
.join(report)
():
validator = JSONValidator()
json_content =
results = validator.validate_json_content(json_content)
report = validator.generate_validation_report(results)
(report)
__name__ == :
main()
import json
from typing import Dict, Any, Optional
import yaml
class JSONFormatter:
"""JSON格式化工具"""
def __init__(self):
self.indent_size = 2
self.sort_keys = False
self.ensure_ascii = False
def format_json_file(self, file_path: str, output_path: Optional[str] = None) -> bool:
"""格式化JSON文件"""
try:
# 读取文件
with open(file_path, 'r', encoding='utf-8') as f:
data = json.load(f)
# 格式化输出
formatted_json = json.dumps(
data,
indent=self.indent_size,
sort_keys=self.sort_keys,
ensure_ascii=self.ensure_ascii
)
# 写入文件
output_file = output_path or file_path
with open(output_file, 'w', encoding='utf-8') as f:
f.write(formatted_json)
Exception e:
()
() -> :
:
(file_path, , encoding=) f:
data = json.load(f)
minified_json = json.dumps(
data,
separators=(, ),
ensure_ascii=.ensure_ascii
)
output_file = output_path file_path
(output_file, , encoding=) f:
f.write(minified_json)
Exception e:
()
() -> :
:
(json_file, , encoding=) f:
data = json.load(f)
(yaml_file, , encoding=) f:
yaml.dump(data, f, allow_unicode=, default_flow_style=)
Exception e:
()
() -> :
:
(yaml_file, , encoding=) f:
data = yaml.safe_load(f)
(json_file, , encoding=) f:
json.dump(data, f, indent=.indent_size, ensure_ascii=.ensure_ascii)
Exception e:
()
() -> [, ]:
:
(file1, , encoding=) f:
data1 = json.load(f)
(file2, , encoding=) f:
data2 = json.load(f)
data1 == data2:
{
: ,
: []
}
:
differences = ._find_differences(data1, data2, )
{
: ,
: differences
}
Exception e:
{
: ,
: (e)
}
() -> []:
differences = []
(obj1) != (obj2):
differences.append()
(obj1, ):
keys1 = (obj1.keys())
keys2 = (obj2.keys())
keys1 != keys2:
missing_in_obj2 = keys1 - keys2
missing_in_obj1 = keys2 - keys1
key missing_in_obj2:
differences.append()
key missing_in_obj1:
differences.append()
common_keys = keys1 & keys2
key common_keys:
new_path = path key
differences.extend(._find_differences(obj1[key], obj2[key], new_path))
(obj1, ):
(obj1) != (obj2):
differences.append()
:
i, (item1, item2) ((obj1, obj2)):
new_path = path
differences.extend(._find_differences(item1, item2, new_path))
obj1 != obj2:
differences.append()
differences
():
formatter = JSONFormatter()
success = formatter.format_json_file()
success:
()
formatter.minify_json_file(, )
formatter.json_to_yaml(, )
comparison = formatter.compare_json_files(, )
comparison[]:
()
:
()
diff comparison[]:
()
__name__ == :
main()