2

我想使用 DotLiquid 在我的 ASP Net Core 2.2 项目中创建 HTML

我的数据源来自传递给方法的 JSon 字符串。

使用 DeserializeObject 反序列化字符串后,我在 Hash.FromAnonymousObject 方法中遇到错误

这有效:

var stuff1 = new
{
    Name = "John",
    Surname = "Smith",
    Addresses = new[] {
        new { City = "New York", State = "NY"},
        new { City = "Milano", State = "IT" }
    }
};
var hash1 = DotLiquid.Hash.FromAnonymousObject(stuff1);

这给了我错误Incorrect number of arguments provided for call to method 'Newtonsoft.Json.Linq.JToken get_Item(System.Object)' Parameter name: property

dynamic stuff2 = JsonConvert.DeserializeObject("{
'Name': 'John', 'Surname': 'Smith',
'Addresses': [
    { 'City': 'New York', 'State': 'NY' },
    { 'City': 'Milano', 'State': 'IT' }
]}");
var hash2 = DotLiquid.Hash.FromAnonymousObject(stuff2);
4

1 回答 1

2

DotLiquid 有一个来自 Dictionary 的替代哈希生成器。我只是能够使用复杂的 json 结构来解决这个问题,并通过执行以下操作来利用它:

包括以下这些:

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

然后(为简洁起见,下面的 json 很简单,但适用于复杂结构,具有非平凡的液体模板)

    string template = "<h4>hello {{name}}</h4>";
    string json = "{ \"name\" : \"john doe\"}";
    dynamic expandoObj = JsonConvert.DeserializeObject<ExpandoObject>(json, new ExpandoObjectConverter());
IDictionary<string, object> expandoDict = new Dictionary<string, object>(expandoObj);

var liquidTemplate = DotLiquid.Template.Parse(template);
var result = liquidTemplate.Render(Hash.FromDictionary(expandoDict));
于 2020-03-21T14:34:19.793 回答