从 JSON Schema 生成 C# 类 [关闭]

Posted

技术标签:

【中文标题】从 JSON Schema 生成 C# 类 [关闭]【英文标题】:Generate C# classes from JSON Schema [closed] 【发布时间】:2011-09-15 13:40:07 【问题描述】:

我正在创建一个以 JSON 格式返回大量数据的 C# WCF Web 服务。 客户端是一个 iPad 应用程序,目前正在由另一个团队开发,所以我正在制定规范,没有示例数据。 目前 JSON 字符串是由 .net 框架创建的,我的 Web 服务正在返回一个 C# 对象,其中包含所有信息,然后框架使用 DataContracts 对其进行序列化。

我的问题是通信规范只包含 JSON Schema 文件(基于http://json-schema.org/)。为了方便开发,我想在C#中生成相应的类,但是由于文件包含很多信息并且文件有十几个,我真的不想手动创建这些类。

所以我正在寻找一种可以让我使用的工具:

从 JSON 架构生成 C# 类。 将 JSON 架构转换为 XSD 文件。那么创建类就很容易了,因为有很多工具可以从 XSD 生成类。

我找到了很多工具来根据 JSON 模式验证 JSON 字符串或从 JSON 字符串生成类,但似乎对我没有任何帮助。 有JSON.NET,但它似乎是一个库而不是工具,我没有找到任何关于使用它生成类的信息。

因此,如果有人知道工具或对如何生成这些类有想法(我尝试了一个用 Java 创建类的工具,但我无法使其工作)。

【问题讨论】:

这个问题不是我要找的。我没有任何 JSON 字符串,我只有一个 JSON Schema。有用于 JSON 字符串的工具 -> 类。但是找不到 JSON Schema -> Class。 我找到了这个站点,它非常适合将 JSON 模式转换为 C#、枚举、JsonConverters 和所有:quicktype.io/csharp。 (由于问题已关闭,无法留下答案。这是一个很好的问题,但没有完整的答案。) 谢谢@MattD 终于有人贴出正确答案了 【参考方案1】:

Visual Studio 2017 具有此功能。

从菜单中,选择编辑、选择性粘贴、将 JSON 粘贴为类。粘贴到 JSON 中,Visual Studio 将创建所需的类。

【讨论】:

谢谢,它对我很有用,你节省了我很多时间 :) 不适用于 SCHEMA ...只是一个 JSON 字符串 我对 JSON2CSHARP 有疑问,但这个答案效果很好 对有用的信息投了赞成票。然而,使用模式会更好,因为它们指定了可选/必需的属性、默认值等。当从数据生成类时,这些细节会丢失。所以你最终可能会得到一些结构上正确的东西,但实际上并不符合要求的规范。 这可能不是来自模式,但它正是我想要的!谢谢大哥!【参考方案2】:

在 nuget 上查找这个库。 NJsonSchema.CodeGeneration 可用于从 JSON 模式生成 C# 或 TypeScript 代码:

var generator = new CSharpGenerator(schema);
var file = generator.GenerateFile();

file 变量现在包含 JSON 模式中定义的所有类的 C# 代码。

【讨论】:

@rico-suter 没有人正确解释过如何在生成代码时加载驻留在文件夹中的所有参考模式。直到今天,任何网站上都没有一个例子。 现在是 json2csharp 转换器工具 json2csharp.com 的正确 URL。 还会指出,您实际上需要添加至少两个包才能完成这项工作... NJsonSchema.CodeGeneration(它添加了其他 pkg,如 NJsonSchema)和 NJsonSchema.CodeGeneration.CSharp。 该站点不再翻译 json 架构。只是json数据。 :-( 但不支持“onOf”一个常见的 Schema 元素...【参考方案3】:

您可以使用库 NJsonSchema 来读取 JSON 架构或从类型生成一个,并从中生成一个 C# 类。

如果您需要用于这些任务的 GUI,您可以尝试使用 NSwag 工具中的 NSwagStudio GUI 来执行此操作...(它也基于 NJsonSchema)

【讨论】:

你应该披露你是真正的开发者 还有可视化的json编辑器:github.com/rsuter/VisualJsonEditor【参考方案4】:

为了正确回答这个问题,您需要知道 Json Schema 的版本(草稿)。

哪些库可以处理哪个 Schema (2018-01-19) 的示例:

Json.NET Schema supports draft 3, draft 4, draft 6 (MIT)
Manatee.Json supports draft 4, draft 6, draft 7 (MIT)
NJsonSchema supports draft 4 (Ms-PL)

http://json-schema.org/implementations.html#validator-dotnet

使用NJsonSchema.CodeGeneration,您也不能直接发送实际的 JSON,您首先需要将其转换为实际的架构(否则您经常会收到错误:Unable to cast object of type 'System.String' to type 'NJsonSchema.JsonSchema4)。

运行代码示例,位于项目根目录的Schemas 文件夹:

class Program

    static void Main(string[] args)
    
        var location = Assembly.GetExecutingAssembly().Location;
        var path = Path.GetFullPath(Path.Combine(location, @"..\..\..\Schemas"));
        var schemaJson = File.ReadAllText($"pathTest.json");
        var schema = JsonSchema4.FromJsonAsync(schemaJson).Result;
        var generator = new CSharpGenerator(schema);
        var generatedFile = generator.GenerateFile();
    

【讨论】:

【参考方案5】:

所以我正在寻找一种工具,可以让我: 从 JSON Schema 生成 C# 类...

我自己没有使用过它,所以我不能对它发表太多评论,但看起来“json-schema-to-poco”这个工具很适合你的需要。

根据其 github 自述文件:

将 JSON 模式文件转换为 C# 中的普通旧 CLR 对象。 对于作为自动构建过程的一部分运行很有用。

【讨论】:

不幸的是,json-schema-to-poco 只是一个没有任何实际实现的存根【参考方案6】:

这是一个在线类生成器,我过去曾使用它从一组 JSON 数据样本中生成 C# 类:

http://json2csharp.com/

【讨论】:

另见jsonclassgenerator.codeplex.com【参考方案7】:

我今天需要这个,但没有看到任何可靠的答案来回答你的问题,所以我做了这个。它并不完美,但它是一个很好的起点。

https://gist.github.com/rushfrisby/c8f58f346548bf31e045

【讨论】:

很好,你的是代码生成器的第一个模式,而不是我发现实际有效的代码生成的示例 json。 我公然抄袭@rushonroeks 代码并将其拆分出来,以便我可以生成其他代码/模型 - 特别是 Knockout 视图模型:gist.github.com/RhysC/480e7a758639a3215701 请注意,rushonerok 的代码依赖于尚未更新以支持 JsonSchema v4 的 JSON.NET:github.com/JamesNK/Newtonsoft.Json/issues/115 如果您有兴趣将此代码改编为 v4,JNK 为其编写了一个库,可以在 nuget.org/packages/Newtonsoft.Json.Schema 找到该库 对我不起作用。我有一个简单的 Json 模式,它无法翻译它。我对 NJsonSchema 没有这样的问题。我的架构:file.io/YQKnrB8gfgxa【参考方案8】:

看看Json.NET的帮助 有一个 Json.Schema 命名空间很有用。

http://james.newtonking.com/projects/json/help/

Json.NET - 快速入门和 API 文档 Newtonsoft.Json.Schema 命名空间 命名空间 ► Newtonsoft.Json.Schema

项目页面:http://json.codeplex.com/

【讨论】:

是的,我已经看到了,但是除了构建我自己的类生成器(如果我没有找到现有工具,我可能会这样做),我认为它没有帮助我可以毫不费力地生成这些类。 @JulienN 你写过自己的类生成器吗? 对不起,我不记得了,但我不这么认为,我可能没有时间,如果我这样做了,我会发布它的 :)。 3年后,它仍然不存在? @JulienN 如果确实存在,这个问题在谷歌上的排名更高。我会继续搜索,感谢您的快速回复。 有人找到解决办法了吗?在我的情况下,即使是 javascript 中类似的东西也能完成这项工作?

以上是关于从 JSON Schema 生成 C# 类 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

C# 反序列化 JSON Schema.org 来自网络的食谱

在 C# 中从 XML Schema 生成代码的限制是啥?

C#实体类生成XML与XML Schema文档

XML Schema 到 C++ 类 [关闭]

JSON TO C#反序列化[关闭]

如何从 Swagger API 声明生成 JSON-Schema