Antlr4 StringTemplate与Json.net动态项不兼容



我想从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 兼容

无论表示dynamic的编译类型是什么,都需要创建一个IModelAdaptor,并使用TemplateGroup.RegisterModelAdaptor进行注册。

受Harwell先生回答的启发,我实现了一个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());

相关内容

  • 没有找到相关文章

最新更新