Создание имен классов C# для объектов в коллекциях в соответствии с именем свойства коллекции

Я пытаюсь использовать NJsonSchema для генерации классов C#, но он называет классы для объектов в массиве "anonymous_".

Например, этот фрагмент схемы JSON

"Идентификаторы": {
          "тип": "массив",
          "Предметы": {
            "тип": "объект",
            "свойства": {
              "Я БЫ": {
                "тип": "строка"
              },
              "IDType": {
                "тип": "строка"
              }
            },
            "требуется": [
              "Я БЫ",
              "IDType"
            ]
          }

Создает это свойство и класс C#

        [Newtonsoft.Json.JsonProperty("Идентификаторы", Обязательный = Newtonsoft.Json.Required.Always)]
        [System.ComponentModel.DataAnnotations.Required]
        public System.Collections.ObjectModel.ObservableCollection Identifiers { 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);
        }
    }
}
Другие вопросы по тегам