【发布时间】: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