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

如何为对象中的JSON字符串字段定义JSON Schema?

如何用JSON Schema验证包含JSON结构的字符串字段

场景说明

你有如下JSON对象,其中details字段是一个包含JSON对象的字符串,需要验证该字符串内的JSON结构符合特定要求:

{
  "id": 1,
  "name": "John Doe",
  "details": "{\"age\": 30, \"email\": \"john.doe@example.com\"}"
}

现有JSON Schema片段如下,需要补全details字段的验证规则:

{
  "type": "object",
  "properties": {
    "id": { "type": "integer" },
    "name": { "type": "string" },
    "details": {
      "type": "string",
      // 此处添加验证逻辑
    }
  }
}

实现方案

JSON Schema本身没有原生关键字能直接将字符串解析为JSON并验证其结构,但可以通过以下两种方式实现:

1. 结合验证器的自定义格式扩展(推荐)

大多数主流JSON Schema验证器(如Ajv)支持自定义格式验证。你可以:

  • 定义一个自定义格式(比如valid-json-details),在验证逻辑中先把字符串解析为JSON,再用子Schema验证解析后的结构。
  • 在Schema中引用这个自定义格式,并指定对应的子Schema。

示例代码(以Ajv为例):

const Ajv = require("ajv");
const ajv = new Ajv();

// 自定义格式验证逻辑
ajv.addFormat("valid-json-details", {
  validate: (str, schema) => {
    try {
      const parsed = JSON.parse(str);
      // 用传入的子Schema验证解析后的JSON
      return ajv.validate(schema.detailsSchema, parsed);
    } catch (e) {
      // 解析失败则验证不通过
      return false;
    }
  },
  // 允许在Schema中传递子Schema
  metaSchema: {
    type: "object",
    properties: {
      detailsSchema: { type: "object" }
    }
  }
});

// 完整的JSON Schema
const schema = {
  type: "object",
  properties: {
    id: { type: "integer" },
    name: { type: "string" },
    details: {
      type: "string",
      format: "valid-json-details",
      detailsSchema: {
        type: "object",
        required: ["age", "email"],
        properties: {
          age: { type: "integer", minimum: 18 },
          email: { type: "string", format: "email" }
        }
      }
    }
  },
  required: ["id", "name", "details"]
};

// 验证示例
const validData = {
  "id": 1,
  "name": "John Doe",
  "details": "{\"age\": 30, \"email\": \"john.doe@example.com\"}"
};
console.log(ajv.validate(schema, validData)); // 输出true

const invalidData = {
  "id": 2,
  "name": "Jane Doe",
  "details": "{\"age\": 17, \"email\": \"invalid-email\"}"
};
console.log(ajv.validate(schema, invalidData)); // 输出false

2. 用正则表达式做基础验证(仅适用于简单结构)

如果你的details字符串对应的JSON结构非常简单,可以用pattern关键字匹配正则表达式,验证字符串格式。但这种方法不适用于复杂JSON结构,因为正则无法可靠解析嵌套的JSON。

示例:

{
  "type": "object",
  "properties": {
    "id": { "type": "integer" },
    "name": { "type": "string" },
    "details": {
      "type": "string",
      // 匹配包含age(整数)和email(邮箱格式)的JSON字符串的简单正则
      "pattern": "^\\{\"age\":\\s*\\d+,\\s*\"email\":\\s*\"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}\"\\}$"
    }
  },
  required: ["id", "name", "details"]
}

注意事项

  • 原生JSON Schema规范(Draft 4至2020-12)均未提供解析字符串为JSON的内置能力,必须依赖验证器的扩展功能。
  • 自定义格式验证是最灵活可靠的方案,能支持任意复杂的JSON结构验证。

内容的提问来源于stack exchange,提问作者Sai Prasanna S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 17:18:24