【问题标题】:JSON Schema to C#JSON 模式到 C#
【发布时间】:2018-06-14 04:16:45
【问题描述】:

我正在寻找一个类或工具来将 JSON 模式转换为 C# 类作为预构建步骤。

我找到了几个“自制”解决方案(jsonschema.net、NJsonSchema、...),但更愿意使用一些与公司/项目相关的成熟/官方代码。我知道 Newtonsoft.json.Schema 包只能反过来(C# Class -> JSON)

我惊讶地发现 Visual Studio 能够使用“编辑 -> 选择性粘贴 -> 将 JSON 粘贴为类”开箱即用地执行此操作。此功能背后的代码/类/可执行文件/dll 在预构建步骤中是否可以通过编程方式访问?

【问题讨论】:

  • 在运行时应该如何工作?如果您要在运行时创建该类,您如何在代码中访问其属性?如果您需要在运行时执行此操作,dynamic 还不够吗?如果您在编写代码时需要它,那么使用 Paste JSON as classes 有什么问题?
  • 好的,我删除了问题的运行时部分,这可能是一个不同的问题。仅仅“将 JSON 粘贴为类”对我们来说并不是一个好的解决方案。我们希望使用 JSON 模式(如 IDL)为我们的接口定义提供一个中心位置,然后在预构建期间生成 C# 类。
  • 你用过json2csharp.com吗?
  • NJsonSchema 看起来像一个成熟的项目。它有命令行工具 nswag.exe,可用于生成 csharp 代码,如下所示:“nswag jsonschema2csclient / input:JsonSchema.json / output:MyClasses.cs”

标签: c# json json.net jsonschema njsonschema


【解决方案1】:

正如@Stiefel 提到的,您可以use nswag for this。首先将NSwag.MSBuild nuget 包添加到您的项目中,这也允许您使用$(NSwagExe) 宏来引用nswag。然后,在你的项目中添加一个预构建步骤,在我的例子中是这样的:

<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
    <Exec Command="$(NSwagExe) jsonschema2csclient /name:Manifest /namespace:ManifestCreator.Models /input:$(SolutionDir)schemas\SingleFileSchema.0.1.0.json /output:$(ProjectDir)Models\ManifestSchema.cs" />
</Target>

【讨论】:

    【解决方案2】:

    您应该能够使用 Visual Studio 模板转换 (T4) 文件执行此操作。几年前,我将它们用于类似的场景——从专有的类似 WSDL 的 XML 格式生成 C# 服务代理类。不幸的是,我无法再访问代码,但是一旦您开始使用 Google 搜索 T4 和 codegen,就很容易弄清楚。

    您可能还想查看可扩展性/自动化模型,即DTE,以确定您是否可以访问内置功能(我将从 T4 启动)。

    T4 确实适用于单个文件(因此是“模板”),但您也可以轻松地从 IDE 中启动模板“构建”以生成多个文件。高级是您将导入 Json.Net 之类的辅助程序集来读取输入,然后使用常规的旧文件 I/O 来写入新文件。它没有太多的魔力。 DTE 可以做一些事情,例如启动外部流程或在完成后呈现串联的构建日志以供人工审查。

    几个注意事项:我还没有在 VS2017 中使用过 T4,但我读过它需要 extra steps 才能开始使用它们,如果你在早期的 VS 上显然有一个 issue 他们不用迁移到 VS2017 后,不要最初加载您的项目。

    【讨论】:

      猜你喜欢
      • 2019-01-17
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 2013-03-24
      相关资源
      最近更新 更多