/ / Antlr4 StringTemplate Json.net गतिशील आइटम के साथ संगत नहीं है - json, गतिशील, json.net, stringtemplate

Antlr4 StringTemplate Json.net गतिशील वस्तुओं के साथ संगत नहीं है - जेसन, गतिशील, json.net, stringtemplate

मैं एक json फ़ाइल से एक गतिशील वस्तु को पढ़ना चाहूंगा और फिर एक स्ट्रिंगटाइप में इसका उपयोग करूंगा।

निम्नलिखित कोड काम करता है।

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

JringConverter को StringTemplate के साथ संगत करने के लिए कॉन्फ़िगर करने का एक और तरीका है

उत्तर:

उत्तर № 1 के लिए 1

आपको एक बनाना होगा IModelAdaptor जो भी संकलित प्रकार का प्रतिनिधित्व करने के लिए dynamic है, और इसका उपयोग करके पंजीकरण करें TemplateGroup.RegisterModelAdaptor.


जवाब के लिए 0 № 2

पर प्रेरित किया श्री हरवेल का जवाब, मैंने "ए लागू किया है IModelAdaptor जो न्यूटनसॉफ्ट के उपयोग को सक्षम करता है। जसन वस्तुओं को पार्स करता है।

ये रहा:

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());