Используйте JSON.NET для создания схемы JSON с дополнительными атрибутами

Я использую JSON.NET для генерации JSON Schema из класса объектов С#. Но мне не удалось добавить какие-либо другие атрибуты схемы json, например. maxLength, шаблон (регулярное выражение для проверки электронной почты) и т.д.

Ниже мой рабочий код, я могу только генерировать 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"
            ]
        }
    }
}

Ответы

Ответ 1

Схема Json.NET теперь значительно улучшила поддержку создания схем.

Вы можете аннотировать свойства с атрибутами аннотации .NET Data, чтобы указать информацию, такую ​​как минимальная, максимальная, minLength, maxLength и многое другое в схеме.

Существует также JSchemaGenerationProvider, который позволяет вам получить полный контроль при создании схемы для типа.

Подробнее здесь: http://www.newtonsoft.com/jsonschema/help/html/GeneratingSchemas.htm

Ответ 2

Джеймс Ньютон-Кинг прав в его ответе, я просто расширю его с помощью примера кода, чтобы люди, спотыкающиеся о эту страницу, не изучали целая документация.

Таким образом, вы можете использовать атрибуты, предоставленные с .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-схему, вам нужно использовать класс JSchemaGenerator, распределенный с пакетом Json.NET Schema. Если вы используете более старый JsonSchemaGenerator, тогда требуется некоторое обновление, поскольку оно теперь устарело и не содержит новых функций, таких как вышеупомянутые.

Здесь примерная функция, которая генерирует Json Schema для класса выше:

    /// <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));

Ответ 3

Вы можете создать пользовательский 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);

Ответ 4

Вы можете использовать класс JavaScriptSerializer. Как:

namespace ExtensionMethods
{
    public static class JSONHelper
    {
        public static string ToJSON(this object obj)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            return serializer.Serialize(obj);
        }

        public static string ToJSON(this object obj, int recursionDepth)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            serializer.RecursionLimit = recursionDepth;
            return serializer.Serialize(obj);
        }
    }
}

Используйте его следующим образом:

using ExtensionMethods;

...

List<Person> people = new List<Person>{
                   new Person{ID = 1, FirstName = "Scott", LastName = "Gurthie"},
                   new Person{ID = 2, FirstName = "Bill", LastName = "Gates"}
                   };


string jsonString = people.ToJSON();

Читайте также следующие статьи:

Вы также можете попробовать ServiceStack JsonSerializer

Один пример использования:

 var customer = new Customer { Name="Joe Bloggs", Age=31 };
    var json = JsonSerializer.SerializeToString(customer);
    var fromJson = JsonSerializer.DeserializeFromString<Customer>(json); 

Ответ 5

  • сначала конвертируйте Json файл в xml
  • теперь добавьте xml node, который вы хотите добавить и преобразовать xml в json.

Это преобразование может быть легко выполнено классом 'newtonsoft.json.jsonconvert'. Для использования этого класса просто импортируйте dll newtonsoft.json в ваш проект.