从 JSON 数据生成 JSON 模式的工具 [关闭]

Posted

技术标签:

【中文标题】从 JSON 数据生成 JSON 模式的工具 [关闭]【英文标题】:Tool to generate JSON schema from JSON data [closed] 【发布时间】:2011-11-12 13:57:27 【问题描述】:

我们有这个 json 模式 draft。我想获取我的 JSON 数据样本并为 JSON 模式生成一个骨架,我可以手动修改它,添加描述、必需等内容,这些内容无法从具体示例中推断出来。

例如,根据我的输入example.json


    "foo": "lorem", 
    "bar": "ipsum"

我会运行我的 json_schema_g​​enerator 工具并得到:

 "foo": 
    "type" : "string",
    "required" : true,
    "description" : "unknown"
  ,
  "bar": 
    "type" : "string",
    "required" : true,
    "description" : "unknown"
  

此示例是手动编码的,因此可能存在错误。 是否有任何工具可以帮助我转换 JSON -> JSON 模式?

【问题讨论】:

但是该工具怎么知道它不是从字符串到字符串的通用映射? 在提供的示例中,我想说很明显我们有一个字典(python 术语),带有键值对,其中的值恰好是字符串。我不知道任何其他可以描述相同数据的 JSON 模式。这只是一个简单的例子:当然,它可能会变得更加复杂,正如 JSON 模式草案中所指定的那样。 所以您声称“从任意字符串映射到其他任意字符串”(例如从文件名到内容描述的映射)不能表示为 JSON 模式?据我所知,这可能是真的,但在我看来,这会使这种模式变得毫无用处。 嗯,我不确定我们是否在讨论与该问题相关的内容,但无论如何。让我们用一个更好的例子:如果 JSON 数据用于描述一个人的属性,那么在 JSON 数据中使用固定键绝对是有用的。不要考虑“foo”和“bar”,而是考虑“name”和“surname”。 “姓名”和“姓氏”显然是人员 JSON 数据的固定属性,因此它们不是任意字符串:它们是人员模式的一部分。这些值当然是任意的,因此它们不是架构的一部分。 拥有固定键有时是您想要的,有时则不是。事实上,这就是重点:自动化工具无法从单个样本中检测出您想要哪些选项。 【参考方案1】:

总结其他答案,这里是迄今为止提出的 JSON 模式生成器:

在线:

https://www.liquid-technologies.com/online-json-to-schema-converter(1 个输入) http://www.jsonschema.net(1 个输入) https://easy-json-schema.github.io(1 个输入)

Python:

https://github.com/gonvaled/jskemator(1 个输入,但允许迭代) https://github.com/perenecabuto/json_schema_generator(1 个输入) https://github.com/rnd0101/json_schema_inferencer(我认为是 1 个输入) https://pypi.python.org/pypi/genson/(多个输入) https://pypi.python.org/pypi/skinfer(多个输入)

NodeJS:

https://github.com/Nijikokun/generate-schema(多个输入(传递对象数组)) https://github.com/easy-json-schema/easy-json-schema(1 个输入) https://github.com/aspecto-io/genson-js(多个输入)

鲁比:

https://github.com/maxlinc/json-schema-generator(1 个输入)

【讨论】:

jskemetor - 没有setup.py 你有没有机会知道这些是否支持 YAML 输入?我们可以转换,但只是一个额外的步骤。【参考方案2】:

您可能正在寻找这个:

http://www.jsonschema.net

它是一个可以从 JSON 字符串自动生成 JSON 模式的在线工具。您可以轻松地编辑架构。

【讨论】:

一个简单方便的起点。但请注意本页其他地方发现的 jsonschema.net 报告的问题,以及讨论希望将离线或至少 API 可访问的工具包含在开发工作流程中的原因,允许使用后面的示例更新模式等。另请参见 nice Steve Bennett 的选项列表。 请注意,此站点在初始导入后编辑架构时会抛出意外错误。 "hello": "world","num": 42 之类的东西而崩溃,但看起来很有希望- 旧网站肯定不够好。 JSONSchema.Net 现在已被重写。它更加健壮。如果您有任何问题,请在 GitHub 上报告,我很乐意修复它们:github.com/jackwootton/json-schema jsonschema2pojo.org 是我多年来一直在使用的【参考方案3】:

GenSON (PyPI | Github) 是一个 JSON 模式生成器,可以从多个对象生成单个模式。您还可以将模式与它合并。它是用 Python 编写的,并带有一个 CLI 工具。

(完全披露:我是作者。)

【讨论】:

干得好,伙计!我很遗憾在开始使用 skinfer 之前没有找到这个:github.com/scrapinghub/skinfer 不是蟒蛇,但这是另一条github.com/snowplow/schema-guru 太棒了!我对在线模式生成器jsonschema.net 感到失望(它无法为大多数对象创建“必需”属性,没有选项来生成紧凑(单行)属性或省略 ID,最重要的是,生成的模式无法验证用于为单模式数组创建它的数据)。期待试用您的工具。 @Dave - 我也面临与 json schema.net 类似的问题,这个 python 工具有帮助吗? @Cshah:我对 GenSON 印象深刻,并为它提供了一个补丁。我需要生成比作者更适应的限制性模式,因此我派生了一个版本,其中包含生成模式属性和附加属性/附加项的选项,以便将无法识别的 JSON 数据标记为需要注意。【参考方案4】:

看到这个问题得到了相当多的支持,我添加了新信息(我不确定这是否是新的,但我当时找不到)

The home of JSON Schema An implementation of JSON Schema validation for Python 相关黑客新闻discussion A json schema generator in python,这正是我要找的。​​li>

【讨论】:

【参考方案5】:

几个月后,我得到的最佳答案是我的简单工具。它是原始但实用的。

我想要的是类似于this 的东西。 JSON 数据可以为 JSON 模式提供框架。我还没有实现它,但是应该可以给出一个现有的 JSON 模式作为基础,以便现有的 JSON 模式加上 JSON 数据可以生成更新的 JSON 模式。如果没有给出这样的模式作为输入,则采用完全默认值。

这在迭代开发中非常有用:工具第一次运行时,JSON 模式是虚拟的,但可以根据数据的演变自动细化。

【讨论】:

很好奇@Green Su 的建议如何未能满足您的需求。我认为您正在描述一个提供 Jumpstarter 的实用程序(您的术语是“骨架”) - 类似于脚手架代码生成器? 基本上,该工具的问题在于它是一个在线工具。我需要它在我的开发环境中本地运行它,有时作为其他任务的一部分自动运行。 “在此处复制,在此处粘贴”工具对我没有帮助。如果它有一个足够好的 REST API。 @justSteve:在线工具,除了使用复制粘贴工作流程外,仍然出现错误(原始问题后 4 年)。我有 json 对象,该工具会为其生成不正确的模式,但尚未将它们减少到最小的测试用例以作为错误报告提交。【参考方案6】:

有一个 python 工具可以为给定的 JSON 生成 JSON Schema:https://github.com/perenecabuto/json_schema_generator

【讨论】:

自 2013 年以来未维护。它不支持 Python 3。此外,它仅支持较旧的草案,即 draft-03【参考方案7】:

generate-schema (NPM | Github) 接受一个 JSON 对象,从中生成模式,一个输出是 JSON 模式,它是用 Node.js 编写的,并带有一个 REPL 和 ClI 工具,用于将文件导入。

完全披露:我是作者 :)

【讨论】:

有计划将模块更新到草稿 4+ 吗?添加最小、最大属性、引用等?感谢您提供的工具 btw :) 将在我的项目中使用它【参考方案8】:

https://github.com/krg7880/json-schema-generator 有一个支持 json schema v4 的 nodejs 工具

它既可以用作命令行工具,也可以用作 nodejs 库:

var jsonSchemaGenerator = require('json-schema-generator'),
    obj =  some:  object: true  ,
    schemaObj;

schemaObj = jsonSchemaGenerator(json);

【讨论】:

还带有 CLI!【参考方案9】:

json-schema-generator 是一个简洁的基于 Ruby 的 JSON 模式生成器。它支持 JSON 模式的草案 3 和草案 4。它可以作为独立的可执行文件运行,也可以嵌入到 Ruby 脚本中。

然后,如果需要,您可以使用 json-schema 根据您新生成的架构验证 JSON 样本。

【讨论】:

【参考方案10】:

对于支持多输入的离线工具,到目前为止我看到的最好的是https://github.com/wolverdude/GenSON/ 我希望看到一个在标准输入上采用文件名的工具,因为我有数千个文件。但是,我用完了打开的文件描述符,因此请确保文件已关闭。我还希望看到处理递归的 JSON 模式生成器。我现在正在从 JSON 对象生成 Java classes,希望能从我的 Java 类中转到 JSON Schema。如果您好奇或想找出其中的错误,这是我的 GenSON 脚本。

#!/bin/sh
ulimit -n 4096
rm x3d*json
cat /dev/null > x3d.json
find ~/Downloads/www.web3d.org/x3d/content/examples -name '*json' -      print| xargs node goodJSON.js | xargs python bin/genson.py -i 2 -s     x3d.json >> x3d.json
split -p '^' x3d.json x3d.json
python bin/genson.py -i 2 -s x3d.jsonaa -s x3d.jsonab /Users/johncarlson/Downloads/www.web3d.org/x3d/content/examples/X3dForWebAuthors/Chapter02-GeometryPrimitives/Box.json > x3dmerge.json 

【讨论】:

首先,您能回复unix.stackexchange.com/questions/211803/…吗?【参考方案11】:

上面提到了很多工具,但记录下还有一个叫做 JSON Schema inferencer:

https://github.com/rnd0101/json_schema_inferencer

(它不是库或产品,而是 Python 脚本)

按照通常的完全披露:我是作者。

【讨论】:

【参考方案12】:

对于 node.js > 6.0.0,还有 json-schema-by-example 模块。

【讨论】:

以上是关于从 JSON 数据生成 JSON 模式的工具 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

从 JSON 模式生成 XML 模式 (XSD)

从 JSON 文档生成 AVRO 模式

JSON 有模式吗?

从 C# 类生成 JSON 模式

从json模式构建spark模式

从 Java 类生成 JSON 模式