Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用异构数组从json模式生成C#类_C#_Json_Jsonschema_Njsonschema - Fatal编程技术网

使用异构数组从json模式生成C#类

使用异构数组从json模式生成C#类,c#,json,jsonschema,njsonschema,C#,Json,Jsonschema,Njsonschema,我在一个项目中有一个json模式,希望添加构建步骤以从中生成类,其中一个模式包含一个对象和字符串数组,简化示例如下: { “$schema”:”http://json-schema.org/draft-04/schema#", “标题”:“testSchema”, “类型”:“对象”, “财产”:{ “数组”:{ “类型”:“数组”, “项目”:{ “任何人”:[ { “类型”:“字符串” }, { “类型”:“对象”, “财产”:{ “姓名”:{ “类型”:“字符串” } } } ] } }

我在一个项目中有一个json模式,希望添加构建步骤以从中生成类,其中一个模式包含一个对象和字符串数组,简化示例如下:

{
“$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感谢您的反馈,我们将尝试这样做