【问题标题】:Runtime objects from JSONSchema in C#C# 中 JSONSchema 的运行时对象
【发布时间】:2020-11-27 09:43:49
【问题描述】:

您可以使用 JSON 架构验证对象。

您可以在运行时使用 dynamic 和 expanddo 生成动态对象

我想做的是在运行时从 JSON 模式生成对象,然后可以根据需要进行填充。

如果这看起来很奇怪,原因是 JSON Schema 将定义一个从另一个来源填充的模板,但系统允许您创建新模板。

根据要求提供示例:

父对象

public class Parent
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public int IntValue { get; set; }
    public decimal DecimalValue { get; set; }
    public double DoubleValue { get; set; }
    public float FloatValue { get; set; }
    public DateTime DateTimeValue { get; set; }

    [EnumDataType(typeof(EnumData))]
    public string EnumValue { get; set; }

    public List<Child> children { get; set; }
}

public enum EnumData
{
    Alpha,
    Beta,
    Charlie
}

子对象

public class Child
{
    public Guid ParentId { get; set; }
    public string ChildName { get; set; }
    public int ChildInt { get; set; }
}

生成的 JSON 架构

{
  "type": "object",
  "properties": {
    "Id": {
      "type": "string"
    },
    "Name": {
      "type": [
        "string",
        "null"
      ]
    },
    "IntValue": {
      "type": "integer"
    },
    "DecimalValue": {
      "type": "number"
    },
    "DoubleValue": {
      "type": "number"
    },
    "FloatValue": {
      "type": "number"
    },
    "DateTimeValue": {
      "type": "string",
      "format": "date-time"
    },
    "EnumValue": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "Alpha",
        "Beta",
        "Charlie"
      ]
    }
  },
  "required": [
    "Id",
    "Name",
    "IntValue",
    "DecimalValue",
    "DoubleValue",
    "FloatValue",
    "DateTimeValue",
    "EnumValue"
  ]
}

模式是对象的定义。如果此定义是由用户选择他们想要的属性、类型、可接受的值等创建的,则可以生成模式。

如果您可以从此架构创建对象的实例,则可以填充属性。

关键是在编码时类是未知的。

这样做的原因是我们有一个庞大的通用数据集,我们需要从中创建更小的数据集,用户可以从应用程序内部定义这些数据集的内容。他们创建的定义可以存储并再次使用。

【问题讨论】:

  • 目前还不清楚您要做什么以及为什么。您能否提供一些此类 JSON 和 Schema 的示例以及任何相关代码?同时,您能否详细说明您为什么要这样做,您要解决的问题是什么?
  • 您还提到了一些“系统”。你能详细说明一下吗?
  • @VladimirSerykh 希望更新后的问题能更好地说明问题
  • 你的愿望听起来像一个 Roslyn 组件.. 有一个代码示例stackoverflow.com/questions/48381483/…
  • @Goodies - 我去看看罗斯林

标签: c# json.net jsonschema


【解决方案1】:

您可以使用我的新库 JsonSchema.Net.Generation 来做到这一点。

var schema = new JsonSchemaBuilder().FromType(myType);

您可以阅读更多关于它的信息in the docs

【讨论】:

  • 恐怕这与我想要的相反,这会生成一个模式。我想生成一个对象,比如 Object obj = JsonUtilLib.ObjectFromSchema(jSonSchema)
  • 您在“Resulting JSON Schema”问题上发布,这意味着您想要完成该架构。这就是我的图书馆所做的。
【解决方案2】:

我认为@gregsdennis 得到了正确的图书馆。如果您查看文档,则可以完成。

The NJsonSchema.CodeGeneration can be used to generate C# or TypeScript code from a JSON schema:

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

The file variable now contains the C# code for all the classes defined in the JSON schema.

【讨论】:

  • 抱歉,我正在使用手机,所以无法正确阅读,回家后会查看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-04
  • 2011-11-01
相关资源
最近更新 更多