我想从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());