我正在使用 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();
另请阅读本文:
- http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx
- http://weblogs.asp.net/scottgu/archive/2007/10/01/tip-trick-building-a-tojson-extension-method-using-net-3-5.aspx
- 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即可。