【问题标题】:generating C# class names for objects in collections according to collection property name根据集合属性名为集合中的对象生成C#类名
【发布时间】:2018-03-27 09:05:40
【问题描述】:

我正在尝试使用 NJsonSchema 生成 C# 类,但它正在为数组“anonymous_”中的对象命名类。

比如这个json模式sn-p

“标识符”:{
          “类型”:“数组”,
          “项目”: {
            “类型”:“对象”,
            “特性”: {
              “ID”: {
                “类型”:“字符串”
              },
              “ID 类型”:{
                “类型”:“字符串”
              }
            },
            “必需的”: [
              “ID”,
              “ID 类型”
            ]
          }

生成此 C# 属性和类

[Newtonsoft.Json.JsonProperty(“标识符”,必需 = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required] 公共 System.Collections.ObjectModel.ObservableCollection 标识符 { get;放; } = new System.Collections.ObjectModel.ObservableCollection();
 [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "9.3.0.0")]
    公共部分类匿名
    {
        [Newtonsoft.Json.JsonProperty("ID", 必需 = Newtonsoft.Json.Required.Always)]
        [System.ComponentModel.DataAnnotations.Required]
        公共字符串 ID { 获取;放; }

        [Newtonsoft.Json.JsonProperty("IDType", 必需 = Newtonsoft.Json.Required.Always)]
        [System.ComponentModel.DataAnnotations.Required]
        公共字符串 IDType { 获取;放; }

        公共字符串 ToJson()
        {
            返回 Newtonsoft.Json.JsonConvert.SerializeObject(this);
        }

        公共静态匿名FromJson(字符串数据)
        {
            返回 Newtonsoft.Json.JsonConvert.DeserializeObject(数据);
        }
    }

想知道是否有一种方法可以强制 NJsonSchema 根据集合名称的单数化版本来命名集合中的对象(例如,在这种情况下,我希望将 anonymous 类命名为 Identifier 之类的名称,因为类描述名为Identifiers 的集合中的对象。我尝试为此使用自定义 TypeNameGenerator,但集合的名称未提供给 Generate 函数。

【问题讨论】:

    标签: c# njsonschema


    【解决方案1】:

    如果您可以修改架构,那么您可以执行以下操作:

    {
      "$schema": "http://json-schema.org/draft-04/schema#",
      "type": "object",
      "properties": {
        "Identifiers": {
          "type": "array",
          "items": {
            "allOf": [
              {
                "$ref": "#/definitions/Identifier"
              }
            ]
          }
        }
      },
      "required": [
        "Identifiers"
      ],
      "definitions": {
        "Identifier": {
          "type": "object",
          "x-typeName": "Identifier",
          "properties": {
            "ID": {
              "type": "string"
            },
            "IDType": {
              "type": "string"
            }
          },
          "required": [
            "ID",
            "IDType"
          ]
        }
      }
    }
    

    使用以下程序测试:

    public static async Task Main(string[] args)
    {
        var json = File.ReadAllText("json-schema-sample.json");
    
        var schema = await JsonSchema4.FromJsonAsync(json);
    
        var csharpSetting = new CSharpGeneratorSettings {Namespace = "Generated.Json", ClassStyle = CSharpClassStyle.Poco};
        var generator = new CSharpGenerator(schema, csharpSetting);
        var file = generator.GenerateFile("Root");
    
        using (var sw = File.CreateText("Generated.cs"))
        {
            sw.Write(file);
        }
    }
    

    它会生成以下类:

    //----------------------
    // <auto-generated>
    //     Generated using the NJsonSchema v9.7.7.0 (Newtonsoft.Json v9.0.0.0) (http://NJsonSchema.org)
    // </auto-generated>
    //----------------------
    
    namespace Generated.Json
    {
        #pragma warning disable // Disable all warnings
    
        [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "9.7.7.0 (Newtonsoft.Json v9.0.0.0)")]
        public partial class Identifier 
        {
            [Newtonsoft.Json.JsonProperty("ID", Required = Newtonsoft.Json.Required.Always)]
            [System.ComponentModel.DataAnnotations.Required]
            public string ID { get; set; }
    
            [Newtonsoft.Json.JsonProperty("IDType", Required = Newtonsoft.Json.Required.Always)]
            [System.ComponentModel.DataAnnotations.Required]
            public string IDType { get; set; }
    
            public string ToJson() 
            {
                return Newtonsoft.Json.JsonConvert.SerializeObject(this);
            }
    
            public static Identifier FromJson(string data)
            {
                return Newtonsoft.Json.JsonConvert.DeserializeObject<Identifier>(data);
            }
        }
    
        [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "9.7.7.0 (Newtonsoft.Json v9.0.0.0)")]
        public partial class Root 
        {
            [Newtonsoft.Json.JsonProperty("Identifiers", Required = Newtonsoft.Json.Required.Always)]
            [System.ComponentModel.DataAnnotations.Required]
            public System.Collections.ObjectModel.ObservableCollection<Identifier> Identifiers { get; set; } = new System.Collections.ObjectModel.ObservableCollection<Identifier>();
    
            public string ToJson() 
            {
                return Newtonsoft.Json.JsonConvert.SerializeObject(this);
            }
    
            public static Root FromJson(string data)
            {
                return Newtonsoft.Json.JsonConvert.DeserializeObject<Root>(data);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      相关资源
      最近更新 更多