特定の式を評価する必要があり、評価に基づいて次のステップを選択します。これにはJint javascriptインタープリターを使用しようとしています。
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テキストがあります。そして、フィルターまたは検索を使用して特定の配列項目を見つけ、それを操作しようとしています。このようなもの、
inputQuestions.Questions.filter((x) => x.Code == \"INIT_IMP\")[0].Answer.Answer.Code
これにより、以下のエラーが表示されます。
未処理の例外。System.ArgumentException: 無効なキー値を持つ JArray 値にアクセスしました: "filter"。Int32 配列インデックスが必要です。
参照用の私の完全なプログラム、
string inputStart = "{\n\t\"PurposeCode\": \"START\",\n\t\"Reference\": {\n\t\t\"CompanyCode\": \"ABC\"\t\t\n\t}\n}";
string inputQuestions = "{\n\t\"QuestionSetCode\": \"QUES_SET_1\",\n\t\"Version\": 1,\n\t\"Questions\": [{\n\t\t\"Code\": \"INIT_IMP\",\n\t\t\"Text\": \"Impact ?\",\n\t\t\"AnswerType\": 3,\n\t\t\"SequenceNumber\": 1,\n\t\t\"Answer\": {\n\t\t\t\"Answers\": [{\n\t\t\t\t\"Code\": \"INIT_IMP_DO\",\n\t\t\t\t\"Text\": \"A\",\n\t\t\t\t\"SequenceNumber\": 1\n\t\t\t}, {\n\t\t\t\t\"Code\": \"INIT_IMP_DA\",\n\t\t\t\t\"Text\": \"B\",\n\t\t\t\t\"SequenceNumber\": 2\n\t\t\t}, {\n\t\t\t\t\"Code\": \"INIT_IMP_AO\",\n\t\t\t\t\"Text\": \"C\",\n\t\t\t\t\"SequenceNumber\": 3\n\t\t\t}],\n\t\t\t\"Answer\": {\n\t\t\t\t\"Code\": \"INIT_IMP_DO\",\n\t\t\t\t\"Text\": \"A\",\n\t\t\t\t\"SequenceNumber\": 1\n\t\t\t},\n\t\t\t\"Type\": \"ListOfValuesAnswer\"\n\t\t},\n\t\t\"Applicable\": true\n\t}, {\n\t\t\"Code\": \"ENT_ACC_LIQ\",\n\t\t\"Text\": \"Exposure ?\",\n\t\t\"AnswerType\": 3,\n\t\t\"SequenceNumber\": 2,\n\t\t\"Answer\": {\n\t\t\t\"Answers\": [{\n\t\t\t\t\"Code\": \"ENT_ACC_LIQ_Y\",\n\t\t\t\t\"Text\": \"Yes\",\n\t\t\t\t\"SequenceNumber\": 1\n\t\t\t}, {\n\t\t\t\t\"Code\": \"ENT_ACC_LIQ_N\",\n\t\t\t\t\"Text\": \"No\",\n\t\t\t\t\"SequenceNumber\": 2\n\t\t\t}],\n\t\t\t\"Answer\": {\n\t\t\t\t\"Code\": \"ENT_ACC_LIQ_N\",\n\t\t\t\t\"Text\": \"No\",\n\t\t\t\t\"SequenceNumber\": 2\n\t\t\t},\n\t\t\t\"Type\": \"ListOfValuesAnswer\"\n\t\t},\n\t\t\"Applicable\": true\n\t}],\n\t\"ClientId\": null\n}";
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
誰かがそのような問題に遭遇した場合、またはこれに対する解決策を提案できる場合は、非常に役立ちます.