【问题标题】:Antlr4 StringTemplate not compatible with Json.net dynamic itemsAntlr4 StringTemplate 与 Json.net 动态项不兼容
【发布时间】:2014-04-15 07:17:47
【问题描述】:

我想从 json 文件中读取一个动态对象,然后在 stringTemplate 中使用它。

以下代码有效。

dynamic data = new { bcName = "Lixam B.V", periodName = "July 2013" };
var engine = new Template("<m.bcName> <m.periodName>");
engine.Add("m", data);
engine.Render().Should().Be("Lixam B.V July 2013");

以下代码失败

var json = "{bcName : 'Lixam B.V', periodName : 'July 2013'}";
dynamic data = JsonConvert.DeserializeObject(json);
string name = (data.bcName);
name.Should().Be("Lixam B.V"); // this passes
var engine = new Template("<m.bcName> <m.periodName>");
engine.Add("m", data);
engine.Render().Should().Be("Lixam B.V July 2013"); //fails

还有其他方法可以配置 JsonConverter 以兼容 StringTemplate

【问题讨论】:

    标签: json dynamic json.net stringtemplate


    【解决方案1】:

    您需要为代表dynamic 的编译类型创建一个IModelAdaptor,并使用TemplateGroup.RegisterModelAdaptor 注册它。

    【讨论】:

      【解决方案2】:

      Mr. Harwell's answer 的启发,我实现了一个IModelAdaptor,它可以使用Newtonsoft.Json 解析对象。

      这里是:

      internal class JTokenModelAdaptor : Antlr4.StringTemplate.IModelAdaptor
      {
          public object GetProperty(
              Antlr4.StringTemplate.Interpreter interpreter,
              Antlr4.StringTemplate.TemplateFrame frame,
              object obj,
              object property,
              string propertyName)
          {
              var token = (obj as JToken)?.SelectToken(propertyName);
              if (token == null)
                  return null;
              if (token is JValue)
              {
                  var jval = token as JValue;
                  return jval.Value;
              }
              return token;
          }
      }
      

      您只需在模板组中注册适配器,如下所示:

      template.Group.RegisterModelAdaptor(typeof(JToken), new JTokenModelAdaptor());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-07
        • 2011-10-02
        • 2019-08-23
        • 2013-02-05
        • 2018-07-04
        • 2011-01-25
        • 1970-01-01
        • 2021-05-21
        相关资源
        最近更新 更多