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

  • 本文关键字:集合 对象 类名 属性 c# njsonschema
  • 更新时间 :
  • 英文 :


我试图使用NJsonSchema生成C#类,但它将数组中对象的类命名为"anonymous_"。

例如,这个json模式片段

"标识符":{"类型":"数组","项目":{"类型":"对象","属性":{"ID":{"type":"string"},"IDType":{"type":"string"}},"必需":["ID","IDType"]}

生成此C#属性和类

[Newtonsoft.Json.JsonProperty("标识符",Required=Newtonsoft.J.son.Required.Always)][System.ComponentModel.DataAnnotations.Required]public System.Collections.ObjectModel.ObsObservableCollection<匿名者>标识符{get;set;}=新System.Collections.ObjectModel.ObsObservableCollection<匿名者>()
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema","9.3.0.0")]公共分部类Anonymous{[Newtonsoft.Json.JsonProperty("ID",Required=Newtonsoft.J.son.Required.Always)][System.ComponentModel.DataAnnotations.Required]公共字符串ID{get;set;}[Newtonsoft.Json.JsonProperty("IDType",Required=Newtonsoft.Json.Required.Always)][System.ComponentModel.DataAnnotations.Required]公共字符串IDType{get;set;}公共字符串ToJson(){return Newtonsoft.Json.JsonConvert.SerializeObject(this);}public static Anonymous FromJson(字符串数据){return Newtonsoft.Json.JsonConvert.DeserializeObject<匿名者>(数据);}}

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

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

{
"$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);
}
}
}

相关内容

  • 没有找到相关文章

最新更新