這裏是我會怎麼做:你的模板
更改爲這種格式Hi {Name.First}
現在創建一個JavaScriptSerializer
轉換JSON在Dictionary<string, object>
JavaScriptSerializer jss = new JavaScriptSerializer();
dynamic d = jss.Deserialize(data, typeof(object));
現在變量d
有一本字典的JSON的值。
有了這些,您可以針對正則表達式運行模板,以遞歸方式用字典的鍵替換{X.Y.Z.N}
。
完整的例子:
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;
});
}
我沒有處理異常(例如值找不到),你可以處理這種情況下,返回匹配的值,如果未找到它。 m.Value
爲原始值或m.Groups[1].Value
爲{}
之間的字符串。
這聽起來像是XSLT的完美場景。 –
只有當你喜歡它帶來的冗長。 –
我的老闆會同意你柯克的觀點,但正如邁克爾說的那樣,這對我想要做的事有點大。並感謝堆邁克爾,你的答案也很好,但只能給一個勾號:) –