根据集合属性名为集合中的对象生成C#类名

Posted

技术标签:

【中文标题】根据集合属性名为集合中的对象生成C#类名【英文标题】:generating C# class names for objects in collections according to collection property name 【发布时间】: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 函数。

【问题讨论】:

【参考方案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);
        
    

【讨论】:

以上是关于根据集合属性名为集合中的对象生成C#类名的主要内容,如果未能解决你的问题,请参考以下文章

Lambda 表达式 - 根据集合中另一个属性的值设置对象集合中一个属性的值

java按照list集合中的对象属性进行去重

java按照list集合中的对象属性进行去重

List集合中的对象根据某个相同的属性,合并另外属性

List集合中的对象根据某个相同的属性,合并另外属性

软考笔记第十四天之UML建模