Создание имен классов C# для объектов в коллекциях в соответствии с именем свойства коллекции
Я пытаюсь использовать NJsonSchema для генерации классов C#, но он называет классы для объектов в массиве "anonymous_".
Например, этот фрагмент схемы JSON
"Идентификаторы": { "тип": "массив", "Предметы": { "тип": "объект", "свойства": { "Я БЫ": { "тип": "строка" }, "IDType": { "тип": "строка" } }, "требуется": [ "Я БЫ", "IDType" ] }
Создает это свойство и класс C#
[Newtonsoft.Json.JsonProperty("Идентификаторы", Обязательный = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required] public System.Collections.ObjectModel.ObservableCollectionIdentifiers { get; задавать; } = новый System.Collections.ObjectModel.ObservableCollection ();
[System.CodeDom.Compiler.GeneratedCode ("NJsonSchema", "9.3.0.0")] публичный частичный класс Anonymous { [Newtonsoft.Json.JsonProperty("ID", обязательный = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required] открытый идентификатор строки { get; задавать; } [Newtonsoft.Json.JsonProperty("IDType", обязательный = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required] открытая строка IDType { get; задавать; } открытая строка ToJson() { return Newtonsoft.Json.JsonConvert.SerializeObject(this); } общедоступная статическая Anonymous FromJson(строковые данные) { return 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);
}
}
}