2011-11-06 27 views
6

Điều tôi có Tôi có các mẫu được lưu trữ trong cơ sở dữ liệu và dữ liệu JSON được chuyển đổi thành từ điển trong C#.Cách tiếp cận nào để tạo mẫu trong C# tôi nên thực hiện?

Ví dụ:

mẫu: "Xin chào {FirstName}"

dữ liệu: "{FirstName: 'Jack'}"

này hoạt động một cách dễ dàng với một mức độ dữ liệu bằng cách sử dụng một biểu thức chính quy để loại bỏ bất kỳ thứ gì trong {} trong mẫu.

Điều tôi muốn Tôi muốn có thể đi sâu hơn trong JSON so với lớp đầu tiên.

Ví dụ:

mẫu: "Xin chào {Tên: {Đầu tiên}}"

dữ liệu: "{Name: {Đầu tiên: 'Jack', cuối: 'Smith'}}"

Tôi nên sử dụng phương pháp nào? (Và một số hướng dẫn về nơi để bắt đầu với lựa chọn của bạn)

  1. Một biểu thức chính quy
  2. Không sử dụng JSON trong mẫu (ủng hộ XSLT hoặc một cái gì đó tương tự)
  3. Cái gì khác

Tôi cũng muốn có thể lặp qua dữ liệu trong mẫu, nhưng tôi không có ý tưởng nào ở tất cả mọi nơi để bắt đầu với mẫu đó!

Cảm ơn heaps

Trả lời

2

Dưới đây là làm thế nào tôi sẽ làm điều đó:

Thay đổi mẫu của bạn để định dạng này Hi {Name.First}

Bây giờ, tạo một JavaScriptSerializer để chuyển đổi JSON in Dictionary<string, object>

JavaScriptSerializer jss = new JavaScriptSerializer(); 
dynamic d = jss.Deserialize(data, typeof(object)); 

Now the variable d has the values ​​of your JSON in a dictionary.

Sau đó, bạn có thể chạy mẫu của mình dựa trên regex để thay thế {X.Y.Z.N} bằng các phím của từ điển, đệ quy.

Full Ví dụ:

public void Test() 
{ 
    // Your template is simpler 
    string template = "Hi {Name.First}"; 

    // some JSON 
    string data = @"{""Name"":{""First"":""Jack"",""Last"":""Smith""}}"; 

    JavaScriptSerializer jss = new JavaScriptSerializer(); 

    // now `d` contains all the values you need, in a dictionary 
    dynamic d = jss.Deserialize(data, typeof(object)); 

    // running your template against a regex to 
    // extract the tokens that need to be replaced 
    var result = Regex.Replace(template, @"{?{([^}]+)}?}", (m) => 
     { 
      // Skip escape values (ex: {{escaped value}}) 
      if (m.Value.StartsWith("{{")) 
       return m.Value; 

      // split the token by `.` to run against the dictionary 
      var pieces = m.Groups[1].Value.Split('.'); 
      dynamic value = d; 

      // go after all the pieces, recursively going inside 
      // ex: "Name.First" 

      // Step 1 (value = value["Name"]) 
      // value = new Dictionary<string, object> 
      // { 
      //  { "First": "Jack" }, { "Last": "Smith" } 
      // }; 

      // Step 2 (value = value["First"]) 
      // value = "Jack" 

      foreach (var piece in pieces) 
      { 
       value = value[piece]; // go inside each time 
      } 

      return value; 
     }); 
} 

tôi không xử lý ngoại lệ (ví dụ giá trị không thể được tìm thấy), bạn có thể xử lý các trường hợp này và trả về giá trị phù hợp nếu nó không được tìm thấy. m.Value cho giá trị thô hoặc m.Groups[1].Value cho chuỗi giữa {}.

2

Bạn có nghĩ đến việc sử dụng Javascript làm ngôn ngữ kịch bản không? Tôi đã thành công lớn với Jint, mặc dù chi phí khởi động cao. Một lựa chọn khác là Jurassic, mà tôi đã không sử dụng bản thân mình.

Nếu bạn tình cờ có một ứng dụng web, sử dụng Razor có thể là một ý tưởng, see here.

Sử dụng Regex hoặc bất kỳ loại phân tích chuỗi nào chắc chắn có thể hoạt động cho những thứ tầm thường, nhưng có thể gây đau khi bạn muốn logic hoặc thậm chí chỉ là các cấu trúc cơ bản. Nếu bạn deserialize JSON của bạn vào Từ điển lồng nhau, bạn có thể xây dựng một phân tích cú pháp tương đối dễ dàng:

// Untested and error prone, just to illustrate the concept 
var parts = "parentObj.childObj.property".split('.'); 
Dictionary<object,object> current = yourDeserializedObject; 
foreach(var key in parts.Take(parts.Length-1)){ 
    current = current[key]; 
} 
var value = current[parts.Last()]; 

Chỉ cần bất cứ điều gì bạn làm, đừng làm XSLT. Thực sự, nếu XSLT là câu trả lời thì câu hỏi phải có được thực sự tuyệt vọng :)

+0

Điều này nghe giống như kịch bản hoàn hảo cho XSLT. –

+0

Chỉ khi bạn thích sự chi tiết mà nó mang theo. –

+0

Ông chủ của tôi sẽ đồng ý với bạn Kirk, nhưng như Michael nói, đó là một chút lớn cho những gì tôi đang cố gắng để làm. Và nhờ heaps Michael, câu trả lời của bạn là tuyệt vời quá nhưng chỉ có thể cho một đánh dấu :) –

4

Bạn đang gặp may! SmartFormat thực hiện chính xác như bạn mô tả. Nó là một tiện ích định dạng chuỗi mã nguồn mở, nhẹ.

Nó hỗ trợ tên placeholders:

var template = " {Name:{Last}, {First}} "; 

var data = new { Name = new { First="Dwight", Last="Schrute" } }; 

var result = Smart.Format(template, data); 
// Outputs: " Schrute, Dwight " SURPRISE! 

Nó cũng hỗ trợ danh sách định dạng:

var template = " {People:{}|, |, and} "; 

var data = new { People = new[]{ "Dwight", "Michael", "Jim", "Pam" } }; 

var result = Smart.Format(template, data); 
// Outputs: " Dwight, Michael, Jim, and Pam " 

Bạn có thể kiểm tra các unit test cho Named PlaceholdersList Formatter để xem nhiều hơn ví dụ!

Nó thậm chí còn có một số dạng xử lý lỗi (bỏ qua lỗi, lỗi đầu ra, lỗi ném).

Lưu ý: tên giữ chỗ tính năng sử dụng phản xạ và/hoặc tra cứu từ điển, vì vậy bạn có thể deserialize JSON thành đối tượng C# hoặc lồng Dictionaries, và nó sẽ làm việc tuyệt vời!

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