使用JSON.NET生成具有额外属性的JSON模式

Yoh*_*Yoh 19 c# json.net jsonschema

我正在使用JSON.NET从c#对象类生成JSON Schema.但我无法添加任何其他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; }
}
Run Code Online (Sandbox Code Playgroud)

{
    "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"
            ]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Paw*_*wan 11

James Newton-King在他的回答中是正确的,我将使用代码示例扩展它,因此人们绊倒在这个页面上不需要研究整个文档.

因此,您可以使用.NET提供的属性来指定那些addidional选项,例如字符串的最大长度或允许的正则表达式模式.这里有些例子:

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; }
}
Run Code Online (Sandbox Code Playgroud)

上面的注释来自System.ComponentModel.DataAnnotations命名空间.

要使这些附加属性影响生成的json模式,您需要使用JSchemaGeneratorJson.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();
    }
Run Code Online (Sandbox Code Playgroud)

你可以像这样使用它:

 string schema = GenerateSchemaForClass(typeof(MyDataModel));
Run Code Online (Sandbox Code Playgroud)


Jam*_*ing 10

Json.NET Schema现在有了很多改进的模式生成支持.

您可以使用.NET的Data Annotation属性注释属性,以在架构上指定minimum,maximum,minLength,maxLength等信息.

还有JSchemaGenerationProvider,可以在为类型生成模式时完全控制.

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


Adr*_*ian -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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

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();
Run Code Online (Sandbox Code Playgroud)

另请阅读这篇文章:

  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); 
Run Code Online (Sandbox Code Playgroud)

  • 我不太明白这如何解决这个问题。 (2认同)