JSON.NETを使用して、c#オブジェクトクラスからJSONスキーマを生成しています。しかし、他のjsonスキーマ属性を追加できませんでした。 maxLength、pattern(電子メールを検証するための正規表現)など
以下は私の作業コードです。必要な属性を持つjsonスキーマのみを生成できます。誰かがjsonスキーマにそれらの余分な属性を追加する方法についてのコード例を投稿できれば素晴らしいでしょう。
ありがとう、
私のコード例
public class Customer
{
[JsonProperty(Required = Required.Always)]
public int CustomerID { get; set; }
[JsonProperty(Required = Required.Always)]
public string FirstName { get; set; }
[JsonProperty(Required = Required.Always)]
public string LastName { get; set; }
[JsonProperty(Required = Required.Always)]
public string Email { get; set; }
[JsonProperty(Required = Required.AllowNull)]
public string Phone { get; set; }
}
に
{
"title" : "Customer",
"type" : "object",
"properties" : {
"CustomerID" : {
"required" : true,
"type" : "integer"
},
"FirstName" : {
"required" : true,
"type" : "string"
},
"LastName" : {
"required" : true,
"type" : "string"
},
"Email" : {
"required" : true,
"type" : "string"
},
"Phone" : {
"required" : true,
"type" : [
"string",
"null"
]
}
}
}
James Newton-Kingは正しい 彼の答え 、コード例で拡張するだけなので、このページに出くわした人は全体を調べる必要はありません ドキュメント 。
したがって、.NETで提供される属性を使用して、文字列の最大長や許可される正規表現パターンなどの追加オプションを指定できます。ここではいくつかの例を示します。
public class MyDataModel
{
public enum SampleEnum { EnumPosition1, EnumPosition2, EnumPosition3 }
[JsonProperty(Required = Required.Always)]
[RegularExpression(@"^[0-9]+$")]
public string PatternTest { get; set; }
[JsonProperty(Required = Required.Always)]
[MaxLength(3)]
public string MaxLength3 { get; set; }
[JsonProperty(Required = Required.AllowNull)]
[EnumDataType(typeof(SampleEnum))]
public string EnumProperty { get; set; }
}
上記の注釈は、System.ComponentModel.DataAnnotations
名前空間からのものです。
これらの追加の属性が結果のjsonスキーマに影響を与えるようにするには、Json.NET Schemaパッケージで配布されるJSchemaGenerator
クラスを使用する必要があります。古いJsonSchemaGenerator
を使用する場合は、廃止され、前述のような新しい関数が含まれていないため、アップグレードが必要です。
上記のクラスのJsonスキーマを生成するサンプル関数は次のとおりです。
/// <summary>
/// Generates JSON schema for a given C# class using Newtonsoft.Json.Schema library.
/// </summary>
/// <param name="myType">class type</param>
/// <returns>a string containing JSON schema for a given class type</returns>
internal static string GenerateSchemaForClass(Type myType)
{
JSchemaGenerator jsonSchemaGenerator = new JSchemaGenerator();
JSchema schema = jsonSchemaGenerator.Generate(myType);
schema.Title = myType.Name;
return schema.ToString();
}
そして、あなたはそれをこのように使うことができます:
string schema = GenerateSchemaForClass(typeof(MyDataModel));
Json.NET Schemaは、スキーマ生成のサポートが大幅に改善されました。
プロパティに.NETのデータ注釈属性で注釈を付けて、スキーマの最小、最大、最小長、最大長などの情報を指定できます。
型のスキーマを生成するときに完全に制御できるJSchemaGenerationProviderもあります。
詳細はこちら: http://www.newtonsoft.com/jsonschema/help/html/GeneratingSchemas.htm
このようなカスタムJsonConverterを作成できます。プロパティを入力するためにリフレクションを使用しました。
public class UserConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var user = (User)value;
var result = new StringBuilder("{");
result.Append("title : " + user.GetType().Name + ", ");
result.Append("properties : {");
foreach (var prop in user.GetType().GetProperties())
{
result.Append(prop.Name + ": {");
result.Append("value : " + Convert.ToString(prop.GetValue(user, null)) + ", ");
var attribute = (JsonPropertyAttribute)Attribute.GetCustomAttributes(prop)[0];
if (attribute.Required == Required.Always)
result.Append("required : true, ");
result.Append("type : " + prop.PropertyType.Name.ToLower());
result.Append(" }");
}
writer.WriteValue(result.ToString());
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var user = new User { UserName = (string)reader.Value };
return user;
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(User);
}
}
[JsonConverter(typeof(UserConverter))]
public class User
{
[JsonProperty(Required = Required.Always)]
public string UserName { get; set; }
}
//Run
string json = JsonConvert.SerializeObject(manager, Formatting.Indented);
Console.WriteLine(json);