2012-02-07 35 views
7

Tôi cần phải tuần tự hóa các đối tượng thành JSON. Tôi muốn làm điều đó với một mẫu thay vì sử dụng chú thích dữ liệu (như hầu hết các khung làm). Có ai biết một cách tốt để làm điều này?Sắp xếp tuần tự hóa các đối tượng C# thành JSON

Một hình ảnh cho biết có hơn 1000 từ. Tôi đang tìm kiếm cái gì đó trông như thế này:

enter image description here

Ví dụ, nếu tôi có một lớp học như thế này:

public class Test 
{ 
    public string Key { get; set; } 
    public string Name { get; set; } 
    public string Code { get; set; } 
    public Test Related { get; set; } 
} 

Và một chuỗi mẫu có mà thể trông như thế này :

{ 
    id: "$Key", 
    name: "$Name", 
    related: "$Related.Name" 
} 

Tôi muốn nhận một đối tượng JSON có thuộc tính được điền theo Key, NameRelated.Name của đối tượng.

Về cơ bản, tôi đang tìm kiếm JSON serialization phương pháp hỗ trợ templating thay thế.

+0

Nó không phải là rất rõ ràng chính xác những gì bạn muốn. Bạn có muốn tạo một phương thức có mẫu đó được mã hóa cứng và hoạt động trên bất kỳ loại nào có 'Khóa',' Tên' và 'Liên kết.Name' không? Hoặc bạn có muốn một hệ thống hoàn chỉnh có thể hiểu các mẫu ở định dạng bạn đã chỉ định và tuần tự hóa bằng cách sử dụng chúng không? – svick

+0

@ KeesC.Bakker Không ai được yêu cầu giải thích downvotes, như downvoting là vô danh. Ngoài ra, câu hỏi này không cho thấy bất kỳ nỗ lực nghiên cứu nào và vô cùng mơ hồ (và có thể lập luận cũng không mang tính xây dựng vì bạn về cơ bản yêu cầu một danh sách các sản phẩm/vật phẩm). – casperOne

+1

@casperOne, tôi không đồng ý rằng câu hỏi này không mang tính xây dựng. Nó hỏi làm thế nào để làm một điều cụ thể. Tôi nghĩ rằng nó có thể được trả lời hợp lý theo cách phù hợp với SO, ít nhất là ở dạng hiện tại. (Tôi đã chỉnh sửa mẫu mẫu trở lại và cố giải thích thêm.) – svick

Trả lời

4

Tôi không biết về bất kỳ thư viện mà thực hiện điều này cho bạn, nhưng nó không phải là khó khăn để xây dựng nó cho mình.

Nếu bạn có mẫu của mình, bạn cần phải phân tích mẫu dưới dạng JSON và sau đó thay thế tất cả các trình giữ chỗ bằng các giá trị thực. Để làm điều đó, bạn có thể sử dụng mẫu khách truy cập.

Kể từ JSON.NET (thư viện JSON Tôi đang sử dụng) dường như không có một người truy cập, bạn có thể tạo một bản thân:

abstract class JsonVisitor 
{ 
    public virtual JToken Visit(JToken token) 
    { 
     var clone = token.DeepClone(); 
     return VisitInternal(clone); 
    } 

    protected virtual JToken VisitInternal(JToken token) 
    { 
     switch (token.Type) 
     { 
     case JTokenType.Object: 
      return VisitObject((JObject)token); 
     case JTokenType.Property: 
      return VisitProperty((JProperty)token); 
     case JTokenType.Array: 
      return VisitArray((JArray)token); 
     case JTokenType.String: 
     case JTokenType.Integer: 
     case JTokenType.Float: 
     case JTokenType.Date: 
     case JTokenType.Boolean: 
     case JTokenType.Null: 
      return VisitValue((JValue)token); 
     default: 
      throw new InvalidOperationException(); 
     } 
    } 

    protected virtual JToken VisitObject(JObject obj) 
    { 
     foreach (var property in obj.Properties()) 
      VisitInternal(property); 

     return obj; 
    } 

    protected virtual JToken VisitProperty(JProperty property) 
    { 
     VisitInternal(property.Value); 

     return property; 
    } 

    protected virtual JToken VisitArray(JArray array) 
    { 
     foreach (var item in array) 
      VisitInternal(item); 

     return array; 
    } 

    protected virtual JToken VisitValue(JValue value) 
    { 
     return value; 
    } 
} 

Và sau đó tạo ra một vị khách đặc biệt có thể thay thế placeholders với giá trị thực tế:

class JsonTemplateVisitor : JsonVisitor 
{ 
    private readonly object m_data; 

    private JsonTemplateVisitor(object data) 
    { 
     m_data = data; 
    } 

    public static JToken Serialize(object data, string templateString) 
    { 
     return Serialize(
      data, (JToken)JsonConvert.DeserializeObject(templateString)); 
    } 

    public static JToken Serialize(object data, JToken template) 
    { 
     var visitor = new JsonTemplateVisitor(data); 

     return visitor.Visit(template); 
    } 

    protected override JToken VisitValue(JValue value) 
    { 
     if (value.Type == JTokenType.String) 
     { 
      var s = (string)value.Value; 

      if (s.StartsWith("$")) 
      { 
       string path = s.Substring(1); 

       var newValue = GetValue(m_data, path); 

       var newValueToken = new JValue(newValue); 

       value.Replace(newValueToken); 

       return newValueToken; 
      } 
     } 

     return value; 
    } 

    private static object GetValue(object data, string path) 
    { 
     var parts = path.Split('.'); 

     foreach (var part in parts) 
     { 
      if (data == null) 
       break; 

      data = data.GetType() 
       .GetProperty(part) 
       .GetValue(data, null); 
     } 

     return data; 
    } 
} 

Cách sử dụng đơn giản.Ví dụ, với các mẫu sau:

{ 
    id : "$Key", 
    name: "$Name", 
    additionalInfo: 
    { 
     related: [ "$Related.Name" ] 
    } 
} 

Bạn có thể sử dụng mã như thế này:

JsonTemplateVisitor.Serialize(data, templateString) 

Kết quả sau đó trông như thế này:

{ 
    "id": "someKey", 
    "name": "Isaac", 
    "additionalInfo": { 
    "related": [ 
     "Arthur" 
    ] 
    } 
} 

Bạn có thể muốn thêm một số lỗi -kiểm tra, nhưng khác hơn thế, mã nên hoạt động. Ngoài ra, nó sử dụng sự phản chiếu, vì vậy nó có thể không phù hợp nếu hiệu suất là quan trọng.

+0

Tôi sẽ thử nó vào ngày mai. Trông đầy hứa hẹn! Cảm ơn cho những nỗ lực. –

0

Không chắc chắn ý bạn là gì bởi một mẫu, nếu bạn đang tìm kiếm bộ nối tiếp json chung. Bạn có thể tìm thấy một trong các bộ nối tiếp Json nhanh nhất cho .NET dưới http://servicestack.net/.

Để cài đặt gói này từ bảng điều khiển trình quản lý gói của bạn, bạn có thể thực hiện lệnh sau.

 PM> Install-Package ServiceStack.Text 
+0

Điều đó dường như không trả lời được câu hỏi. Nó không chỉ là về serializer JSON. – svick

+0

Svick là đúng, tôi đang tìm một serializer và một cách để mẫu những thuộc tính tôi muốn serialize. –

+1

@ KeesC.Bakker Tôi không hiểu tại sao tôi bị downvote? Tôi nghĩ tôi đã giải thích rõ ràng trong câu trả lời của tôi rằng, tôi không hiểu ý của bạn là gì bằng cách tạo khuôn mẫu và câu trả lời của tôi chỉ dành cho việc tuần tự hóa json. Bây giờ với hình ảnh tôi biết chính xác những gì bạn muốn đạt được. – ASetty

0

ServiceStack có vẻ là lựa chọn tốt. enter image description here

http://www.servicestack.net/benchmarks/

+1

Điều đó dường như không trả lời câu hỏi. Nó không chỉ là về serializer JSON. – svick

+0

Svick là đúng, tôi đang tìm một serializer và một cách để mẫu những thuộc tính tôi muốn serialize. –

+1

@svick, downvote cho cái gì? Khi tôi thêm câu trả lời của tôi, @ Kees C. Bakker đã không tải lên 1000 từ của mình có giá trị hình ảnh được nêu ra. – ValidfroM

Các vấn đề liên quan