【发布时间】:2021-05-20 02:25:08
【问题描述】:
我正在尝试使用 Newtonsoft JSON Schema 生成 JSON Schema。在我的 POCO 类中添加的常规属性会在生成模式时添加到模式中。我也在使用 PostSharp Aspects 添加属性,但这些都没有添加到架构中。
这是一个面向 .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 Schema 的问题,还是我做错了什么。看来这应该是可能的。
5 月 20 日 1 日编辑
我将我的解决方案分成单独的项目——一个用于控制台应用程序,一个用于 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();
现在我的架构包括方面生成的属性。
【问题讨论】:
-
如果您序列化带有
AspectProp集的MyClass实例会发生什么? -
当我使用 System.Text.Json.JsonSerializer 将 MyClass 序列化为 JSON 时,AspectProp 存在:{"MyProperty":3,"AspectProp":"zz"} 具有我设置的值
-
查看 Newtonsoft.Json.Serialization.DefaultContractResolver.SerializeCompilerGeneratedMembers 属性。
-
赢家,赢家,鸡肉晚餐...@AntonínProcházka 把它作为答案,我会接受。谢谢。
-
@TimTheEnchanter 太棒了!乐意效劳。快乐 PostSharping!
标签: json.net jsonschema postsharp