使用 JSON.NET 生成具有额外属性的 JSON 架构



我正在使用 JSON.NET 从c#对象类生成JSON模式。但是我无法添加任何其他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"
            ]
        }
    }
}

James Newton-King的回答是正确的,我将用一个代码示例来扩展它,这样偶然发现此页面的人就不需要研究整个文档。

因此,可以使用 .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 架构,需要使用随 Json.NET 架构包分发JSchemaGenerator类。如果您使用较旧的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));

Json.NET Schema 现在具有大大改进的架构生成支持。

可以使用 对属性进行批注。NET 的数据注释属性,用于指定架构上的最小值、最大值、最小长度、最大长度等信息。

还有 JSchemaGenerationProvider,它允许您在为类型生成架构时完全控制。

更多详情请见:http://www.newtonsoft.com/jsonschema/help/html/GeneratingSchemas.htm

您可以创建自定义 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);

你可以使用 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();

另请阅读本文:

  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); 
  • 首先将 JSON 文件转换为 XML
  • 现在添加要添加 XML 并将其转换为 JSON 的 XML 节点。

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

相关内容

  • 没有找到相关文章

最新更新