2012-04-23 2 views
15

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

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

ответ

-4

Вы могли бы использовать в JavaScriptSerializer class.Like:

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

Читайте также эти статьи:

  1. http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx
  2. http://weblogs.asp.net/scottgu/archive/2007/10/01/tip-trick-building-a-tojson-extension-method-using-net-3-5.aspx
  3. http://www.asp.net/AJAX/Documentation/Live/mref/T_System_Web_Script_Serialization_JavaScriptSerializer.aspx

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

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

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

Я не совсем понимаю, как это рассматривается вопрос , – unomi

0

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

Это полезно, но я не думаю, что добавлю атрибут 'JsonConverter' в класс, потому что тогда, когда приходит время сериализовать класс с фактическими данными (а не схемой), это не сработает. Вместо этого передайте экземпляр конвертера методу 'SerializeObject' при создании схемы. –

-4
  • первый новообращенный вы JSON-файл, чтобы XML
  • теперь добавить XML-узел, который вы хотите добавить и конвертировать XML, чтобы JSON.

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

+0

Плохая идея. Там не должно быть необходимости использовать XML вообще для создания схемы JSON. Кроме того, структурная информация иногда может потеряться при преобразовании из JSON в XML в зависимости от ситуации. –

7

Json.NET Schema теперь имеет значительно улучшенную поддержку генерации схемы.

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

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

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

+1

Можете ли вы помочь мне с тем, что они упомянули в своем лицензировании для коммерческого использования? Можем ли мы использовать это как бесплатный продукт? http://www.newtonsoft.com/jsonschema#licensing – Rikki

+0

json-schema не полезен для коммерческого использования. Вы должны купить у них лицензию. Я думаю, вам лучше использовать NJsonSchema, который является MIT: https://github.com/RSuter/NJsonSchema – juFo

7

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

Таким образом, вы можете использовать атрибуты, предоставленные с .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)); 
Смежные вопросы