使用www.example.com进行Dotliquid JSON转换JSON.net

vyswwuz2  于 2023-06-25  发布在  .NET
关注(0)|答案(2)|浏览(116)

我对执行JSON转换很感兴趣,并研究了使用dotliquid。
为了避免输入JSON的POCO只是为了能够将其作为变量发送,我想发送反序列化的JSON。从我的理解,我们不能发送动态渲染方法,和JObject或JArray不按预期工作。我尝试反序列化为Dictionary <string,object>,但无法处理嵌套的JSON结构。
液体

[
{%- for p in data.names -%}
{
"name" : {{ p.name }}
} {%- unless forloop.Last == true -%},{% endunless %}         
{%- endfor -%}
]

C#代码

Template template = Template.Parse(File.ReadAllText("Maps/account.liquid"));             
var json = JsonConvert.DeserializeObject<Dictionary<string, object>>(
    @"{ ""names"":[{""name"": ""John""},{""name"":""Doe""}]  }");              

var jsonHash = Hash.FromAnonymousObject(new { Data = json});

输出量

[
  {
    "name" : 
  },         
  {
    "name" :  
  }         
]

我知道Microsoft Logic Apps已经使用dotliquid实现了类似的功能。https://learn.microsoft.com/en-us/azure/logic-apps/logic-apps-enterprise-integration-liquid-transform
有哪些不同的方式?我是否需要将JObject/JArray解析为嵌套的Dictionary,或者有什么替代方案?

kmbjn2e3

kmbjn2e31#

您可以使用来自Deserialize JSON recursively to IDictionary<string,object>的DictionaryConverter和Hash.FromDictionary使其工作

var json = JsonConvert.DeserializeObject<IDictionary<string, object>>(@"{ ""names"":[{""name"": ""John""},{""name"":""Doe""}]  }", new DictionaryConverter());
var jsonHash = Hash.FromDictionary(json);
var templatetest = "<h1>{{device}}</h1><h2>{{speed}}</h2>{% for client in names %}<h4>{{client.name}}</h4>{% endfor %}";

var template = Template.Parse(templatetest);
var render = template.Render(jsonHash);
deyfvvtc

deyfvvtc2#

另一个可行的选择是使用ExpandoObject转换器:

var jsonObj = JsonConvert.DeserializeObject<ExpandoObject>(json, new Newtonsoft.Json.Converters.ExpandoObjectConverter());

这在我的用例中是可行的,但是我们有一个围绕Template的 Package 器,它扩展了可用性以接受其他类型,这可能是很好地处理了动态。

相关问题