2012-04-23 72 views
15

我使用JSON.NET从c#对象类生成JSON模式。但是我无法添加任何其他json模式属性,例如(正则表达式来验证电子邮件)等使用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 2013-05-27 04:30:16

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'方法。 – 2014-01-09 19:34:02

-4
  • 第一转换你到XML
  • 现在添加您想添加和成JSON XML转换XML节点JSON文件。

这种转换可以通过'newtonsoft.json.jsonconvert'类轻松完成。要使用此类,只需在项目中导入newtonsoft.json dll。

+0

这是一个坏主意。根本不需要使用XML来创建JSON模式。此外,根据具体情况,结构信息有时会在从JSON来回转换为XML时丢失。 – 2014-01-09 19:30:06

7

Json.NET Schema现在已经大大改进了对模式生成的支持。

您可以使用.NET的Data Annotation属性注释属性,以在模式上指定诸如minimum,maximum,minLength,maxLength等的信息。

还有JSchemaGenerationProvider,可让您在为类型生成模式时进行完全控制。

更多细节在这里:http://www.newtonsoft.com/jsonschema/help/html/GeneratingSchemas.htm

+1

您可以帮助我们提及他们在商业用途许可中提及的内容吗?我们仍然可以将其作为免费产品使用吗? http://www.newtonsoft.com/jsonschema#licensing – Rikki 2015-09-28 09:44:41

+0

json-schema对商业用途没有用处。你必须从他们那里购买许可证。我认为你最好使用麻省理工学院的NJsonSchema:https://github.com/RSuter/NJsonSchema – juFo 2017-11-29 09:48:31

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架构包。如果您使用较旧的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));