根据集合属性名为集合中的对象生成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#类名的主要内容,如果未能解决你的问题,请参考以下文章