Используйте 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 в ваш проект.