2012-04-23 29 views
15

Tôi đang sử dụng JSON.NET để tạo JSON Schema từ lớp đối tượng C#. Nhưng tôi không thể thêm bất kỳ thuộc tính giản đồ json nào khác, ví dụ: maxLength, pattern (regex để xác thực email), v.v.Sử dụng JSON.NET để tạo lược đồ JSON với các thuộc tính phụ

Dưới đây là mã làm việc của tôi, tôi chỉ có thể tạo lược đồ json với thuộc tính bắt buộc. Nó sẽ là tuyệt vời nếu bất cứ ai có thể đăng một số ví dụ mã về làm thế nào để thêm các thuộc tính thêm cho lược đồ json.

Cảm ơn,

mã ví dụ của tôi

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" 
      ] 
     } 
    } 
} 

Trả lời

-4

Bạn có thể sử dụng 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); 
     } 
    } 
} 

Sử dụng nó như thế này:

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

đọc cũng bài viết này:

  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

Bạn cũng có thể thử ServiceStack JsonSerializer

Một ví dụ để sử dụng:

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

Tôi hoàn toàn không thấy cách này đề cập đến câu hỏi . – unomi

0

Bạn có thể tạo JsonConverter tùy chỉnh như thế này. Tôi đã sử dụng sự phản chiếu để điền vào các thuộc tính.

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

Điều này rất hữu ích, nhưng tôi không nghĩ rằng tôi sẽ thêm thuộc tính 'JsonConverter' vào lớp, vì sau đó khi đến thời gian để tuần tự hóa lớp với dữ liệu thực tế (không phải lược đồ), nó sẽ không hoạt động. Thay vào đó, chuyển một thể hiện của trình biến đổi sang phương thức 'SerializeObject' khi tạo lược đồ. –

-4
  • chuyển đổi đầu tiên bạn tệp json theo để xml
  • bây giờ thêm nút xml mà bạn muốn thêm vào và chuyển đổi xml để json.

Chuyển đổi này có thể dễ dàng được thực hiện bởi lớp 'newtonsoft.json.jsonconvert'. Để sử dụng lớp này, chỉ cần nhập dll newtonsoft.json vào dự án của bạn.

+0

Đây là một ý tưởng tồi. Không nên chỉ cần sử dụng XML để tạo một lược đồ JSON. Ngoài ra, thông tin cấu trúc đôi khi có thể bị mất khi chuyển đổi qua lại từ JSON sang XML, tùy thuộc vào tình huống. –

7

Json.NET Schema hiện có nhiều hỗ trợ tạo lược đồ được cải thiện.

Bạn có thể chú thích các thuộc tính với thuộc tính Chú thích dữ liệu của .NET để chỉ định thông tin như tối thiểu, tối đa, minLength, maxLength và nhiều hơn nữa trên lược đồ.

Ngoài ra còn có JSchemaGenerationProvider cho phép bạn kiểm soát hoàn toàn khi tạo lược đồ cho một loại.

Xem thêm chi tiết ở đây: http://www.newtonsoft.com/jsonschema/help/html/GeneratingSchemas.htm

+1

Bạn có thể giúp tôi với những gì họ đã đề cập trong giấy phép sử dụng thương mại của họ không? Chúng ta có thể sử dụng nó như một sản phẩm miễn phí không? http://www.newtonsoft.com/jsonschema#licensing – Rikki

+0

giản đồ json không hữu ích cho việc sử dụng thương mại. Bạn phải mua giấy phép từ họ. Tôi nghĩ bạn nên sử dụng NJsonSchema, đó là MIT: https://github.com/RSuter/NJsonSchema – juFo

7

James Newton-King là ngay trong his answer, tôi sẽ chỉ mở rộng nó với một mã ví dụ để mọi người ngại vào trang này không cần phải nghiên cứu toàn bộ documentation.

Vì vậy, bạn có thể sử dụng các thuộc tính được cung cấp với .NET để chỉ định các tùy chọn bổ sung đó, như độ dài tối đa của chuỗi hoặc mẫu regex được phép. Dưới đây là một số ví dụ:

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; } 
} 

Chú thích ở trên đến từ không gian tên System.ComponentModel.DataAnnotations.

Để làm cho các thuộc tính bổ sung đó ảnh hưởng đến lược đồ json kết quả, bạn cần sử dụng JSchemaGenerator lớp được phân phối với gói Json.NET Schema. Nếu bạn sử dụng cũ hơn JsonSchemaGenerator, thì cần nâng cấp một số vì nó hiện không còn được dùng nữa và không chứa các chức năng mới như đã nói ở trên.

Dưới đây là một hàm mẫu mà tạo ra Json Schema cho lớp trên:

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

và bạn có thể sử dụng nó giống như thế này:

string schema = GenerateSchemaForClass(typeof(MyDataModel)); 
Các vấn đề liên quan