首页 > 解决方案 > C# 中 JSONSchema 的运行时对象

问题描述

您可以使用 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"
  ]
}

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

如果您随后可以从此模式创建对象的实例,则可以填充属性。

关键是在编码时不会知道该类。

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

标签: c#json.netjsonschema

解决方案


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

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

您可以在 docs中阅读有关它的更多信息。


推荐阅读