![](/img/trans.png)
[英]C# How to convert Poco to List<Poco> without knowing which poco you're using
[英]Convert json schema to a c# poco without attributes
我正在尋找將簡單的 json 模式轉換為 c# poco。
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Test_Schema",
"description": "A schema for validating a test object",
"type": "object",
"additionalProperties": false,
"properties": {
"GeneralData": {
"type": "object",
"description": "Advsor and admin customer information",
"properties": {
"Name": {
"type": [ "string", "null" ],
"description": "Customer's advisor name"
},
"Age": {
"type": [ "string", "null" ],
"description": "Customer's advisor email"
},
"Location": {
"type": [ "string", "null" ],
"description": "The advisor's manager email'"
}
},
"required": [ "Name", "Location", "Age" ],
"additionalProperties": false
},
"ClientData": {
"type": "object",
"description": "Customer's information",
"properties": {
"Title": {
"type": [ "string", "null" ]
},
"Forename": {
"type": [ "string", "null" ]
},
"Surname": {
"type": [ "string", "null" ]
}
},
"required": [ "Title" ],
"if": {
"properties": {
"Forename": { "enum": [ "Someone" ] }
}
},
"then": { "required": [ "Surname" ] },
"additionalProperties": false
}
}
}
我使用 NJsonSchema 來做這件事,它做得很好。 但是,我希望創建沒有任何序列化失敗的屬性的 POCO。 我想填充 C# object,然后讓 json 架構驗證運行。如果需要某些東西或 null 讓 poco 填充,然后允許我序列化它,然后可能會在針對架構的 json 驗證上失敗。
NJsonSchema 在很多方面都是完美的,但是我找不到在生成時取消屬性 JsonProperty 的方法。
這是我的 NJsonSchema 代碼生成代碼。
internal void WriteJsonToFile(JsonSchema jsonSchema)
{
var generator = new CSharpGenerator(jsonSchema)
{
Settings =
{
GenerateDataAnnotations = false,
RequiredPropertiesMustBeDefined = false,
EnforceFlagEnums = false,
ClassStyle = CSharpClassStyle.Poco,
GenerateNativeRecords = false,
Namespace = nameof(JsonValidation)+"."+ nameof(TestSchemaPoco),
SchemaType = SchemaType.JsonSchema,
PropertyNameGenerator = new CSharpPropertyNameGenerator{}
}
};
var file = generator.GenerateFile();
File.WriteAllText("somefile.cs", file);
}
這是生成的 class
//----------------------
// <auto-generated>
// Generated using the NJsonSchema v11.0.0.0 (Newtonsoft.Json v13.0.0.0) (http://NJsonSchema.org)
// </auto-generated>
//----------------------
namespace JsonValidation.TestSchemaPoco
{
#pragma warning disable // Disable all warnings
/// <summary>
/// A schema for validating a test object
/// </summary>
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "11.0.0.0 (Newtonsoft.Json v13.0.0.0)")]
public partial class Test_Schema
{
/// <summary>
/// Advsor and admin customer information
/// </summary>
[Newtonsoft.Json.JsonProperty("GeneralData", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public GeneralData GeneralData { get; set; }
/// <summary>
/// Customer's information
/// </summary>
[Newtonsoft.Json.JsonProperty("ClientData", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public ClientData ClientData { get; set; }
}
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "11.0.0.0 (Newtonsoft.Json v13.0.0.0)")]
public partial class GeneralData
{
/// <summary>
/// Customer's advisor name
/// </summary>
[Newtonsoft.Json.JsonProperty("Name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public string Name { get; set; }
/// <summary>
/// Customer's advisor email
/// </summary>
[Newtonsoft.Json.JsonProperty("Age", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public string Age { get; set; }
/// <summary>
/// The advisor's manager email'
/// </summary>
[Newtonsoft.Json.JsonProperty("Location", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public string Location { get; set; }
}
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "11.0.0.0 (Newtonsoft.Json v13.0.0.0)")]
public partial class ClientData
{
[Newtonsoft.Json.JsonProperty("Title", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public string Title { get; set; }
[Newtonsoft.Json.JsonProperty("Forename", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public string Forename { get; set; }
[Newtonsoft.Json.JsonProperty("Surname", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public string Surname { get; set; }
}
}
從我能找到的。 這對於 NJsonSchema 是不可能的。
https://github.com/RicoSuter/NJsonSchema/issues/521
https://github.com/RicoSuter/NSwag/issues/2213
我的解決方案是使用 vim 編輯器並創建一個宏來刪除我在 /[System 和 /[Newtonsoft 上找到的內容
這會刪除注釋並給我一個干凈的 POCO class。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.