web-dev-qa-db-ja.com

JSON.NETを使用して、追加の属性を持つJSONスキーマを生成します

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"
            ]
        }
    }
}
19
Yoh

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));
11
Paweł Bulwan

Json.NET Schemaは、スキーマ生成のサポートが大幅に改善されました。

プロパティに.NETのデータ注釈属性で注釈を付けて、スキーマの最小、最大、最小長、最大長などの情報を指定できます。

型のスキーマを生成するときに完全に制御できるJSchemaGenerationProviderもあります。

詳細はこちら: http://www.newtonsoft.com/jsonschema/help/html/GeneratingSchemas.htm

10

このようなカスタム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);
0
sgud