0

我正在尝试使用 NJsonSchema 生成 C# 类,但它正在为数组“anonymous_”中的对象命名类。

例如,这个 json 模式片段

“身份标识”: {
          “类型”:“数组”,
          “项目”: {
            “类型”:“对象”,
            “特性”: {
              “ID”: {
                “类型”:“字符串”
              },
              “ID 类型”:{
                “类型”:“字符串”
              }
            },
            “必需的”: [
              “ID”,
              “ID 类型”
            ]
          }

生成此 C# 属性和类

        [Newtonsoft.Json.JsonProperty(“标识符”,必需 = Newtonsoft.Json.Required.Always)]
        [System.ComponentModel.DataAnnotations.Required]
        公共 System.Collections.ObjectModel.ObservableCollection<Anonymous> 标识符 { get; 放; } = new System.Collections.ObjectModel.ObservableCollection<Anonymous>();
    [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<Anonymous>(数据);
        }
    }

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

4

1 回答 1

2

如果您可以修改架构,则可以执行以下操作:

{
  "$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);
        }
    }
}
于 2017-10-16T01:30:10.747 回答