使用异构数组从json模式生成C#类
我在一个项目中有一个json模式,希望添加构建步骤以从中生成类,其中一个模式包含一个对象和字符串数组,简化示例如下:使用异构数组从json模式生成C#类,c#,json,jsonschema,njsonschema,C#,Json,Jsonschema,Njsonschema,我在一个项目中有一个json模式,希望添加构建步骤以从中生成类,其中一个模式包含一个对象和字符串数组,简化示例如下: { “$schema”:”http://json-schema.org/draft-04/schema#", “标题”:“testSchema”, “类型”:“对象”, “财产”:{ “数组”:{ “类型”:“数组”, “项目”:{ “任何人”:[ { “类型”:“字符串” }, { “类型”:“对象”, “财产”:{ “姓名”:{ “类型”:“字符串” } } } ] } }
{
“$schema”:”http://json-schema.org/draft-04/schema#",
“标题”:“testSchema”,
“类型”:“对象”,
“财产”:{
“数组”:{
“类型”:“数组”,
“项目”:{
“任何人”:[
{
“类型”:“字符串”
},
{
“类型”:“对象”,
“财产”:{
“姓名”:{
“类型”:“字符串”
}
}
}
]
}
}
}
}
我终于实现了我所需要的
其思想是将自定义的csharptypesolver
传递到CSharpGenerator
:
新CSharpGenerator(jsonSchema4,设置,新CustomCSharpTypeResolver(设置,jsonSchema4),null)
看来这不是作者的本意。
在CustomCSharpTypeResolver
I覆盖Resolve
方法中添加以下行为:
if(schema.AnyOf.Count>0)
返回“对象”;
作为简化示例的结果,我有以下模型:
//----------------------
//
//使用NJsonSchema v8.32.6319.16936生成(http://NJsonSchema.org)
//
//----------------------
命名空间JsonSchemaClassGenerator.TestSchema
{
#pragma warning disable//禁用所有警告
[System.CodeDom.Compiler.GeneratedCode(“NJsonSchema”,“8.32.6319.16936”)]
公共部分类TestSchema:System.ComponentModel.INotifyPropertyChanged
{
private System.Collections.ObjectModel.ObservableCollection _array=new System.Collections.ObjectModel.ObservableCollection();
[Newtonsoft.Json.JsonProperty(“数组”,必需=Newtonsoft.Json.Required.DisallowNull,NullValueHandling=Newtonsoft.Json.NullValueHandling.Ignore)]
public System.Collections.ObjectModel.ObservableCollection数组
{
获取{返回_数组;}
设置
{
if(_数组!=值)
{
_数组=值;
RaisePropertyChanged();
}
}
}
公共事件System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
公共字符串ToJson()
{
返回Newtonsoft.Json.JsonConvert.SerializeObject(this);
}
公共静态TestSchema FromJson(字符串数据)
{
返回Newtonsoft.Json.JsonConvert.DeserializeObject(数据);
}
受保护的虚拟void RaisePropertyChanged([System.Runtime.CompilerServices.CallerMemberName]字符串propertyName=null)
{
var handler=PropertyChanged;
if(处理程序!=null)
处理程序(这个,新的System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
}
[System.CodeDom.Compiler.GeneratedCode(“NJsonSchema”,“8.32.6319.16936”)]
公共部分类对象:System.ComponentModel.INotifyPropertyChanged
{
私有字符串\u名称;
[Newtonsoft.Json.JsonProperty(“name”,Required=Newtonsoft.Json.Required.DisallowNull,NullValueHandling=Newtonsoft.Json.NullValueHandling.Ignore)]
公共字符串名
{
获取{return\u name;}
设置
{
如果(_name!=值)
{
_名称=值;
RaisePropertyChanged();
}
}
}
公共事件System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
公共字符串ToJson()
{
返回Newtonsoft.Json.JsonConvert.SerializeObject(this);
}
来自JSON的公共静态对象(字符串数据)
{
返回Newtonsoft.Json.JsonConvert.DeserializeObject(数据);
}
受保护的虚拟void RaisePropertyChanged([System.Runtime.CompilerServices.CallerMemberName]字符串propertyName=null)
{
var handler=PropertyChanged;
if(处理程序!=null)
处理程序(这个,新的System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
}
}
反序列化工作正常。我可以随心所欲地投射对象。只有一个问题:对象被保存为JObject
实例,因此我需要实现explicit
或implicit
操作符将其转换为生成的模型
namespace JsonSchemaClassGenerator.TestSchema
{
公共部分类对象
{
公共静态隐式运算符对象(JObject json)
{
从json(json.ToString())返回;
}
}
}
在此之后,可以将JObject
转换为生成的模型(Object
不是系统。Object
只是用这样的名称生成的):
objecta=config.Entries[1]作为JObject;
这是我找到的最简单的解决办法。我认为还可以实现自定义
csharptypesolver
,以获得更安全的类型。但不确定我是否会尝试,因为对我来说,首先让NJsonSchema
更灵活会更好。我最喜欢的JSON-to-C转换器是我已经生成了你的JSON,它看起来更适合作为你的类来表示你的JSON。也许,它能帮助你吗?我是NJS的作者。分解程序旨在扩展以支持此类情况(请参阅)。如果您需要更多的扩展点,请在github上创建一个问题,我们可以在那里讨论…@ricoster感谢您的反馈,我们将尝试这样做