【问题标题】:Properties Added with Aspects Not in Generated JSON Schema使用不在生成的 JSON 架构中的方面添加的属性
【发布时间】: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


【解决方案1】:

Newtonsoft.Json 有一个可选功能,可以序列化编译器生成的属性。请参阅Newtonsoft.Json.Serialization.DefaultContractResolver.SerializeCompilerGeneratedMembers 属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 2021-10-10
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    相关资源
    最近更新 更多