Объединить пользовательский шаблон html с пользовательскими данными json

Я пытаюсь создать общий служебный класс, который создает тело шаблона электронной почты с двумя входами

  1. html шаблон с заполнителями (может иметь повторяющиеся записи)
  2. данные json

Ожидаемый результат - сгенерировать html-файл, объединяющий html-шаблон и jsondata. Поскольку я не знаю заранее все шаблоны или схему данных json, мне, возможно, придется использовать объект Dynamic / Expando или классы, связанные с синтаксическим анализом Json.

Вот пример Sample html

<ul id='products'>
  {{ for product in products }}
    <li>
      <h2>{{ product.name }}</h2>
           Price: {{ product.price }}
           {{ product.description }}
    </li>
  {{ end }}
</ul>

Образец данных

{
  "products": [
    {
      "name": "Ball",
      "price": 788.0,
      "description": "Matches Ball"      
    },
    {
      "name": "Bat",
      "price": 2000.0,
      "description": "Wooden Bat"     
    }
  ]
}

Я пробовал использовать https://github.com/lunet-io/scriban и https://www.nuget.org/packages/Newtonsoft.Json/, но не смог обойти проблемы. Я открыт для других предложений

 public string RenderHtml(string templateHTML, string jsonData)
 {
            Scriban.Template template = Scriban.Template.Parse(templateHTML);

            JObject jsonObject = JObject.Parse(jsonData);

            return template.Render(jsonObject);
 }

person Maulik Modi    schedule 12.09.2019    source источник
comment
Вы можете сослаться на проект github.com/nicholas-brooks/scribanonline, который используется для создать демонстрационную страницу, которая отображает вывод на основе модели и шаблона   -  person Nest    schedule 16.09.2019


Ответы (1)


Вы можете десериализовать объект и, если это просто, сопоставить его с объектом скрипта Scriban.

Нравится:

private static string GenerateTemplate()
{
  ExpandoObject reportData = JsonConvert.DeserializeObject<ExpandoObject>("{\"name\": \"Alejandro\"}");

  var scriptObject = new Scriban.Runtime.ScriptObject();
  foreach (var prop in obj)
  {
    scriptObject.Add(prop.Key, prop.Value);
  }
  var template = Template.Parse("<h1>{{name}}</h1>");
  return template.Render(scriptObject, member => LowerFirstCharacter(member.Name));
}

private static string LowerFirstCharacter(string value)
{
    if (value.Length > 1)
        return char.ToLower(value[0]) + value.Substring(1);
    return value;
}

Надеюсь, это поможет,

Ваше здоровье!

person Alejandro Barone    schedule 13.07.2020