Основываясь на предыдущем ответе, это решение для сложных объектов:
public static class ScribanRenderer
{
public static string RenderJson(string json, string content)
{
var expando = JsonConvert.DeserializeObject<ExpandoObject>(json);
var sObject = BuildScriptObject(expando);
var templateCtx = new Scriban.TemplateContext();
templateCtx.PushGlobal(sObject);
var template = Scriban.Template.Parse(content);
var result = template.Render(templateCtx);
return result;
}
private static ScriptObject BuildScriptObject(ExpandoObject expando)
{
var dict = (IDictionary<string, object>) expando;
var scriptObject = new ScriptObject();
foreach (var kv in dict)
{
var renamedKey = StandardMemberRenamer.Rename(kv.Key);
if (kv.Value is ExpandoObject expandoValue)
{
scriptObject.Add(renamedKey, BuildScriptObject(expandoValue));
}
else
{
scriptObject.Add(renamedKey, kv.Value);
}
}
return scriptObject;
}
}
Он использует тот факт, что сложные свойства ExpandoObject
всегда ExpandoObjects
, когда он десериализуется из JSON , Он рекурсивно добавляет ScriptObjects
для сложных типов элементов и сам объект для всех других свойств в `` ScriptObject`.
Обратите внимание, что мое решение использует переименование элемента Scriban по умолчанию, где FirstName
становится first_name
и т. д.