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.
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
@ 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
@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