使用JInt分析和评估复杂对象



我需要评估某些表达式,并根据评估结果选择下一步。我正在尝试使用JInt-javscript解释器。

对于json的基本评估,它运行良好。但当我试图在数组上添加额外的操作时,问题就来了。

我的方法,基础对象的设置值=>编写一个函数来计算表达式=>调用此函数并传递表达式以评估=>函数将使用eval来计算传递的字符串。初始对象已在前面的步骤中设置。

像这样的

inputStart.Reference.CompanyCode == "ABC"

在这个例子中,inputStart是我已经使用设置的基本对象

engine.SetValue("inputStart", JsonConvert.DeserializeObject(inputStart));

inputStart是json文本。Fiddle也有字符串供参考。最后是的功能

engine.Execute("function evaluateExpression(expression) { " +
"return eval(expression); " +
"}")
.GetValue("evaluateExpression");
var test = engine.Invoke("evaluateExpression", "inputStart.Reference.CompanyCode == "ABC"");

此代码工作正常。现在的变体是,我有另一个json文本,其中有数组。我正在尝试使用filter或find来定位特定的数组项,然后对其进行一些操作。像这样的

inputQuestions.Questions.filter((x) => x.Code == "INIT_IMP")[0].Answer.Answer.Code

这给了我以下错误,

未处理的异常。System.ArgumentException:访问的JArray值具有无效键值:";过滤器";。应为Int32数组索引。

我的完整程序供参考,

string inputStart = "{nt"PurposeCode": "START",nt"Reference": {ntt"CompanyCode": "ABC"ttnt}n}";
string inputQuestions = "{nt"QuestionSetCode": "QUES_SET_1",nt"Version": 1,nt"Questions": [{ntt"Code": "INIT_IMP",ntt"Text": "Impact ?",ntt"AnswerType": 3,ntt"SequenceNumber": 1,ntt"Answer": {nttt"Answers": [{ntttt"Code": "INIT_IMP_DO",ntttt"Text": "A",ntttt"SequenceNumber": 1nttt}, {ntttt"Code": "INIT_IMP_DA",ntttt"Text": "B",ntttt"SequenceNumber": 2nttt}, {ntttt"Code": "INIT_IMP_AO",ntttt"Text": "C",ntttt"SequenceNumber": 3nttt}],nttt"Answer": {ntttt"Code": "INIT_IMP_DO",ntttt"Text": "A",ntttt"SequenceNumber": 1nttt},nttt"Type": "ListOfValuesAnswer"ntt},ntt"Applicable": truent}, {ntt"Code": "ENT_ACC_LIQ",ntt"Text": "Exposure ?",ntt"AnswerType": 3,ntt"SequenceNumber": 2,ntt"Answer": {nttt"Answers": [{ntttt"Code": "ENT_ACC_LIQ_Y",ntttt"Text": "Yes",ntttt"SequenceNumber": 1nttt}, {ntttt"Code": "ENT_ACC_LIQ_N",ntttt"Text": "No",ntttt"SequenceNumber": 2nttt}],nttt"Answer": {ntttt"Code": "ENT_ACC_LIQ_N",ntttt"Text": "No",ntttt"SequenceNumber": 2nttt},nttt"Type": "ListOfValuesAnswer"ntt},ntt"Applicable": truent}],nt"ClientId": nulln}";

Engine engine = new Engine();

engine.SetValue("inputStart", JsonConvert.DeserializeObject(inputStart));
engine.SetValue("inputQuestions", JsonConvert.DeserializeObject(inputQuestions));

engine.Execute("function evaluateExpression(expression) { " +
"return eval(expression); " +
"}")
.GetValue("evaluateExpression");
var test = engine.Invoke("evaluateExpression", "inputQuestions.Questions.filter((x) => x.Code == "INIT_IMP")[0].Answer.Answer.Code == "INIT_IMP_DO" && inputStart.Reference.CompanyCode == "ABC"");

Console.WriteLine(test);

这是我要做的全部工作,https://dotnetfiddle.net/GtamM8

如果有人遇到过这样的问题,或者可以提出解决方案,这将非常有帮助。

因为您使用的是新的语言结构,所以您应该使用NuGet的3.x预览版本。3.x系列包含对lambda表达式的支持以及对它们的数组过滤。

最新更新