ESQLでJSON子ノードデータにアクセスするにはどうすればよいですか?

Aug 23 2020

私のためにこれを見てくれてありがとう。

IBM ACE V11ソフトウェアで作業していますが、サービスでJSONメッセージを受信します。

このJSONメッセージをESQLを介してSOAPリクエストにマップする必要があります。

以下のサンプルメッセージを参照してください。

着信JSONメッセージ:

   "journals": [
                    {
                            "journalName": "Plant Species in London",
                            "journalYear": "2016",
                            "journalAuthor": [
                                    {
                                            "name": "Julian Bose",
                                            "subject": "botany"
                                    }
                                    {
                                            "name": "Samantha Adams",
                                            "subject": "biology"
                                    }, 
                            ],
                            "samplePolling": {
                                    "pollingInterval": 120,
                                    "totalAttempts": 10
                            }
                    },
              
            ],
            "supervisorName": "James Smith"
    }

ESQLでは、これまでに次のことがあります。

ジャーナルの名前の場合:

SET OutputRoot.SOAP.Body.ns:submitJournal.ns:journalName = InputRoot.JSON.Data.journals.journalName;  

ジャーナルの年:

SET OutputRoot.SOAP.Body.ns:submitJournal.ns:journalYear = InputRoot.JSON.Data.journals.journalYear;  

Journal's Authorの場合、問題があります。問題は、0〜3人以上の作成者がいる可能性があることです。この場合、2人の作成者がいます。

最初に作成者が存在するかどうかを確認し、存在する場合は何人存在するかを確認してから、各作成者の詳細をSOAPに割り当てる方法を教えてください。(これはすべてESQLで)。

ESQLでは、これまでのところこれがあります。しかし、「n」の値を取得する方法がわかりません。(nは著者の数を表します)。

SET OutputRoot.SOAP.Body.ns:submitJournal.ns:journalAuthorValues[n].ns16:AuthorName = InputRoot.JSON.journals.journalAuthor[n].name; 

ありとあらゆる助けに大いに感謝します。

回答

kimbert Aug 24 2020 at 08:00

Journal's Authorの場合、問題があります。問題は、0〜3人以上の作成者がいる可能性があることです。この場合、2人の作成者がいます。

著者の配列を反復処理する必要があり、著者の数を数える必要があると想定しています。しかし、あなたはそうする必要はありません。これは問題なく動作するはずです(テストされておらず、構文エラーが含まれている可能性があります)

FOR refAuthor AS InputRoot.JSON.Data.journals.(JSON.Array)journalAuthor[] DO
    CREATE LASTCHILD OF OutputRoot.SOAP.Body.ns:submitJournal.ns:journalAuthorValues 
       TYPE NAMEVALUE
       IDENTITY ns16:AuthorName
       VALUE FIELDVALUE(refAuthor);
END FOR

ESQLでカウントされたループを使用しないようにする必要があります。FORステートメントまたはSELECTステートメントは、ほとんどの場合、より単純で優れています。