0

特定の式を評価する必要があり、評価に基づいて次のステップを選択します。これには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

誰かがそのような問題に遭遇した場合、またはこれに対する解決策を提案できる場合は、非常に役立ちます.

4

1 に答える 1