添加的属性不在生成的 JSON 架构中
Properties Added with Aspects Not in Generated JSON Schema
我正在尝试使用 Newtonsoft JSON 模式生成 JSON 模式。在我的 POCO class 中添加的常规属性在生成时添加到架构中。我还使用 PostSharp Aspects 添加属性,但其中 none 已添加到架构中。
这是一个针对 .NET 4.7.2 的控制台应用程序。
这是我的控制台应用程序:
public class Program
{
private static void Main(string[] args)
{
JSchemaGenerator gen = new JSchemaGenerator();
JSchema schema = gen.Generate(typeof(MyClass));
File.WriteAllText("C:\Temp\TestSchema.json", schema.ToString());
}
}
这是我的方面:
[PSerializable]
public class TestAspect : InstanceLevelAspect
{
[IntroduceMember]
[JsonProperty(Required = Required.Always)]
public string AspectProp { get; set; }
}
这是我的 POCO:
[TestAspect]
public class MyClass
{
public int MyProperty { get; set; }
}
最后,这是生成的架构:
{
"type": "object",
"properties": {
"MyProperty": {
"type": "integer"
}
},
"required": [
"MyProperty"
]
}
MyProperty
属性 在架构中,但 AspectProp
- 方面添加的 属性 - 不在。
当我在反编译器中打开 exe 时,我可以看到 AspectProp
实际上被添加到 MyClass
:
我不确定这是 PostSharp 或 Newtonsoft JSON 模式的问题还是我做错了什么。看来应该可以。
编辑 1:5 月 20 日
我将我的解决方案拆分成单独的项目 - 一个用于控制台应用程序,一个用于 Aspect,一个用于 MyClass
。在确保我直接引用生成的 MyClass
DLL 之后(即不是项目引用,我实际上在构建 MyClass
后删除了项目)它没有任何区别。 AspectProp
仍然不在架构中。基于此和@dbc 在下面建议的序列化,这让我相信这是 Newtonsoft 模式生成器的问题
编辑 2:5 月 20 日
根据下面 Antonin 的回答,我创建了一个新的 ContractResolver:
public class AspectPropertyResolver : DefaultContractResolver
{
public AspectPropertyResolver()
{
SerializeCompilerGeneratedMembers = true;
}
}
然后在调用 Generate
:
之前在我的应用程序中注册它
gen.ContractResolver = new AspectPropertyResolver();
现在我的架构包括方面生成的 属性。
Newtonsoft.Json 有一个选择加入功能来序列化编译器生成的属性。参见 Newtonsoft.Json.Serialization.DefaultContractResolver.SerializeCompilerGeneratedMembers
属性。
我正在尝试使用 Newtonsoft JSON 模式生成 JSON 模式。在我的 POCO class 中添加的常规属性在生成时添加到架构中。我还使用 PostSharp Aspects 添加属性,但其中 none 已添加到架构中。
这是一个针对 .NET 4.7.2 的控制台应用程序。
这是我的控制台应用程序:
public class Program
{
private static void Main(string[] args)
{
JSchemaGenerator gen = new JSchemaGenerator();
JSchema schema = gen.Generate(typeof(MyClass));
File.WriteAllText("C:\Temp\TestSchema.json", schema.ToString());
}
}
这是我的方面:
[PSerializable]
public class TestAspect : InstanceLevelAspect
{
[IntroduceMember]
[JsonProperty(Required = Required.Always)]
public string AspectProp { get; set; }
}
这是我的 POCO:
[TestAspect]
public class MyClass
{
public int MyProperty { get; set; }
}
最后,这是生成的架构:
{
"type": "object",
"properties": {
"MyProperty": {
"type": "integer"
}
},
"required": [
"MyProperty"
]
}
MyProperty
属性 在架构中,但 AspectProp
- 方面添加的 属性 - 不在。
当我在反编译器中打开 exe 时,我可以看到 AspectProp
实际上被添加到 MyClass
:
我不确定这是 PostSharp 或 Newtonsoft JSON 模式的问题还是我做错了什么。看来应该可以。
编辑 1:5 月 20 日
我将我的解决方案拆分成单独的项目 - 一个用于控制台应用程序,一个用于 Aspect,一个用于 MyClass
。在确保我直接引用生成的 MyClass
DLL 之后(即不是项目引用,我实际上在构建 MyClass
后删除了项目)它没有任何区别。 AspectProp
仍然不在架构中。基于此和@dbc 在下面建议的序列化,这让我相信这是 Newtonsoft 模式生成器的问题
编辑 2:5 月 20 日 根据下面 Antonin 的回答,我创建了一个新的 ContractResolver:
public class AspectPropertyResolver : DefaultContractResolver
{
public AspectPropertyResolver()
{
SerializeCompilerGeneratedMembers = true;
}
}
然后在调用 Generate
:
gen.ContractResolver = new AspectPropertyResolver();
现在我的架构包括方面生成的 属性。
Newtonsoft.Json 有一个选择加入功能来序列化编译器生成的属性。参见 Newtonsoft.Json.Serialization.DefaultContractResolver.SerializeCompilerGeneratedMembers
属性。