json.valid仅验证json语法,不校验json-ld语义规则;需用lanetix/jsonld-go的validate做轻量结构检查,或通过expand执行完整上下文解析与语义验证。

json.Valid 只能测 JSON 语法,不认 JSON-LD
json.Valid 判断的是纯 JSON 语法合法性,比如 {"@context":"https://schema.org","name":"Alice"} 它会返回 true——但这只是“长得像 JSON-LD”,不代表它是合法的 JSON-LD。JSON-LD 有额外语义规则:@context 必须是字符串、对象或数组;@id 不能是数字;@type 不能是布尔值;嵌套 @graph 里重复 @id 会违反规范……这些 json.Valid 一律不管。
用 github.com/lanetix/jsonld-go 做轻量验证
标准库不支持 JSON-LD 校验,得靠第三方库。目前最稳定、维护活跃的是 github.com/lanetix/jsonld-go(非官方但被多个生产项目采用)。它提供 jsonld.Validate,可检测基础结构错误:
- 缺失必需字段如
@context(除非是@graph根节点) -
@context值类型非法(例如"@context": 42) -
@type是空数组或包含非法字符 -
@id是 null 或非字符串
示例用法:
import "github.com/lanetix/jsonld-go"<br><br>data := []byte(`{"@context": "https://schema.org", "@type": "Person", "name": "Alice"}`)<br>err := jsonld.Validate(data)<br>if err != nil {<br> log.Printf("JSON-LD validation failed: %v", err)<br>}
真正要校验 JSON-LD 合法性,得走完整展开流程
仅靠 Validate 不够——它不检查上下文解析结果、不验证 @vocab 是否可解析、也不报 @reverse 用错位置这类问题。唯一可靠方式是调用 jsonld.Expand:
基于三引擎设计,从微信文章、新闻和博客网页提取干净内容,支持标题作者日期元数据,多格式和批量处理。
- 输入原始 JSON-LD 字节
- 触发完整上下文加载、IRI 解析、别名展开
- 失败时返回明确错误,如
jsonld.ErrInvalidContext或jsonld.ErrInvalidId - 成功则返回标准化后的展开结构(通常是个
[]map[string]interface{}),说明格式与语义双合规
注意:这会实际发起 HTTP 请求加载远程 @context(如 "https://schema.org"),需配置 jsonld.WithDocumentLoader 控制行为,否则可能超时或失败。
别把 JSON-LD 当普通 JSON 处理
常见踩坑点:
- 用
json.Unmarshal直接解到 struct → 字段名对不上(@context无法映射到 Go 字段,Go 不允许@开头的标识符) - 误信前端传来的
Content-Type: application/ld+json→ 实际 body 可能是 HTML 错误页或空字符串,必须先做bytes.TrimSpace+len(data) > 0检查 - 用
json.RawMessage存原始数据再 later 解析 → 对 JSON-LD 来说,延迟解析没意义,因为验证必须在展开阶段做,不是字段级的事
真正要落地,得把 JSON-LD 验证当作独立协议层来对待,而不是“多几个 @ 字符的 JSON”。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










