DATA-INTO returning 1002: parse error: trailing garbage█

Discussions relating to the ScottKlement.com port of the open source YAJL JSON Reader/Generator. This includes the YAJL tool as well as the YAJLR4, YAJLGEN, YAJLINTO and YAJLDTAGEN add-ons from ScottKlement.com. http://www.scottklement.com/yajl/
Post Reply
Cardenej
Posts: 1
Joined: Thu Feb 23, 2023 5:28 pm

DATA-INTO returning 1002: parse error: trailing garbage█

Post by Cardenej »

Hello, I am trying to parse a JSON message and I am getting this training garbage error back.

1002: parse error: trailing garbage█
I am including the calling program code as well as the processing procedure that handles the request.
This test harness calls the program that actually does the parsing, etc.

Thanks in advance for any ideas or suggestions.

Code: Select all

H OPTION(*NoDebugIO: *SrcStmt)
      *------------------------------------------------------------------------*
      * Templates                                                              *
      *------------------------------------------------------------------------*
      * XML CLOB
     D JSONCLOB_t      DS                  QUALIFIED
     D                                     TEMPLATE
     D  Length                       10U 0 INZ(0)
     D  Data                    1500000A   INZ(*BLANKS)
      *------------------------------------------------------------------------*
      * Global Variables                                                       *
      *------------------------------------------------------------------------*
     D JSONCLOB        S                   SQLTYPE(CLOB:200000)
     D mCount          S             12S 0 inz(0)

       For mCount = 1 to 2;

         If %rem(mCount:2) = 0 ;

           clear JSONCLOB_Data;

           JSONCLOB_Data = '{"Rqst":{' +
             '"AccountOwnershipMatch": {' +
                 '"OverallMatchScore": "vijgoso",' +
                 '"ConditionCode": "kobur",' +
                 '"FullNameMatch": "Peruxxi",' +
                 '"FirstNameMatch": "Lillie",' +
                 '"MiddleNameMatch": "Arthur Sntos",' +
                 '"BusinessNameMatch": "787-87-3355",' +
                 '"DateOfBirthMatch": "4/5/1990",' +
                 '"SSNMatch": "302-20-1281",' +
                 '"FullAddressMatch": "517 Vim Trail",' +
                 '"AddressLine1Match": "902 Cugje Loop",' +
                 '"AddressLine2Match": "748 Gaso Key",' +
                 '"CityMatch": "Zagkamog",' +
                 '"StateMatch": "VT",' +
                 '"ZipMatch": "65476",' +
                 '"HomePhoneMatch": "(650) 753-3551",' +
                 '"WorkPhoneMatch": "(977) 955-2435",' +
                 '"IDTypeMatch": "5673339817295872",' +
                 '"IDNoMatch": "6930803466436608",' +
                 '"IDStateMatch": "FL",' +
                 '"SignerOwnerMatch": "avar",' +
                 '"NamePrefixMatch": "Miss",' +
                 '"NameSuffixMatch": "Olga Harpoo"' +
             '},' +
             '"AccountStatus": {' +
                 '"PrimaryStatusCode": "ravad",' +
                 '"SecondaryStatusCode": "luwsegoh",' +
                 '"AdditionalStatusCode": "himmo",' +
                 '"PrimaryMessage": "51",' +
                 '"SecondaryMessage": "28",' +
                 '"AdditionalMessage": "44",' +
                 '"NumberOfReturns": "3537288640331776",' +
                 '"LastReturnDate": "Bolognesi",' +
                 '"LastReturnReason": "Bergmann",' +
                 '"StopAmount": "warpat",' +
                 '"StopBeginningNumber": "5438836765097984",' +
                 '"StopEndNumber": "6656568909103104",' +
                 '"StopExpirationDate": "12/20/2051",' +
                 '"LastUpdated": "Bakker",' +
                 '"AdditionalClosedDate": "6/10/2027",' +
                 '"PreviousStatus": "dujta",' +
                 '"FCRADisputeIndicator": "dedriujo",' +
                 '"FCRADisputeAdditionalInformation": "awku",' +
                 '"ScoredAccountsReason1": "3528648829",' +
                 '"ScoredAccountsReason2": "426535590",' +
                 '"ScoredAccountsReason3": "201429791",' +
                 '"ScoredAccountsReason4": "601142779",' +
                 '"ScoredAccountsReason5": "368261339",' +
                 '"RealTimeHighFocusResponseCode": "23:45",' +
                 '"RealTimeDuplicateItemResponseCode": "16:00",' +
                 '"ParticipantAccountScoreResponseCode": "60118891",' +
                 '"DisputeResponseCode": "okua",' +
                 '"AdditionalInformation": {' +
                     '"Code": "897",' +
                     '"Message": "Unscor No Info"' +
                 '}' +
             '},' +
             '"AccountDetails":' +
                 '{' +
                     '"RoutingTransitNumber": "122199983",' +
                     '"AccountNumber": "89855",' +
                     '"CheckSerialNumber": "88885",' +
                     '"Amount": "85556",' +
                     '"CreditAccountRoutingNumber": "88884",' +
                     '"CreditAccountRoutingNumber": "88883",' +
                     '"FeeAttribute": "NW"' +
                 '},' +
             '"Status": {' +
                 '"StatusCode": "kifeco",' +
                 '"StatusMessage": "55",' +
                 '"MoreInformation": "ketwokp",' +
                 '"TransactionId": "1408474393083904"' +
             '}' +
           '}}';

          Else;
            clear JSONCLOB_Data;

            JSONCLOB_Data = '{"Rqst":{' +
               '"AccountStatus":{' +
               '"PrimaryStatusCode": "099",' +
               '"SecondaryStatusCode": "000",' +
               '"AdditionalStatusCode": "897",' +
               '"PrimaryMessage": "Open Valid",' +
               '"AdditionalMessage": "Unscor No Info",' +
               '"LastUpdated": "20090313",' +
               '"AdditionalClosedDate": "20090313",' +
               '"PreviousStatus": "000",' +
               '"FCRADisputeAdditionalInformation": " ",' +
               '"RealTimeHighFocusResponseCode": "0",' +
               '"RealTimeDuplicateItemResponseCode": "0",' +
               '"ParticipantAccountScoreResponseCode": "0",' +
               '"DisputeResponseCode": "X",' +
               '"AdditionalInformation": {' +
                  '"Code": "897",' +
                  '"Message": "Unscor No Info"' +
               '}' +
            '},' +
            '"AccountDetails": {' +
              '"RoutingTransitNumber": "122199983",' +
              '"AccountNumber": "89455",' +
              '"CheckSerialNumber": "203618",' +
              '"Amount": "2440090",' +
              '"CreditAccountRoutingNumber": "082900872",' +
              '"CreditAccountNumber": "12312313",' +
              '"FeeAttribute": "NA"' +
            '},' +
            '"Status": {' +
              '"StatusCode": "200",' +
              '"StatusMessage": "Success",' +
              '"MoreInformation": "Success response received from EWS",' +
              '"TransactionID": "ef4fbe68-8def-11ed-b9d2-644d425a0000-1"' +
            '}' +
           '}}';
         ENDIF;

         JSONCLOB_Len = %LEN(%TRIM(JSONCLOB_Data));

         EXEC SQL CALL PGMM114LIB.Fraud_Insert_Check_Score_Details  (:JSONCLOB);

       ENDFOR;

       Return;
This is the program that is failing to parse.

Code: Select all

ctl-opt option(*nodebugio:*srcstmt:*nounref) dftactgrp(*no)
       actgrp(*new) bnddir('ABOBIN_DIR':'YAJL2');

       DCL-F FRDLOG KEYED USAGE(*OUTPUT) ;
       DCL-DS FRDLOGOut LIKEREC( RFRDLOG : *OUTPUT ) INZ;

       /include QRPGLESRC,yajl_h

       // File Data Structures
       dcl-ds Rqst Qualified Inz;
         dcl-ds AccountOwnershipMatch ;
            OverallMatchScore                      varchar(20);
            ConditionCode                          varchar(20);
            FullNameMatch                          varchar(30);
            FirstNameMatch                         varchar(30);
            MiddleNameMatch                        varchar(30);
            BusinessNameMatch                      varchar(30);
            DateOfBirthMatch                       varchar(30);
            SSNMatch                               varchar(30);
            FullAddressMatch                       varchar(30);
            AddressLine1Match                      varchar(30);
            AddressLine2Match                      varchar(30);
            CityMatch                              varchar(30);
            StateMatch                             varchar(30);
            ZipMatch                               varchar(30);
            HomePhoneMatch                         varchar(30);
            WorkPhoneMatch                         varchar(30);
            IDTypeMatch                            varchar(30);
            IDNoMatch                              varchar(30);
            IDStateMatch                           varchar(30);
            SignerOwnerMatch                       varchar(30);
            NamePrefixMatch                        varchar(30);
            NameSuffixMatch                        varchar(30);
         end-ds AccountOwnershipMatch;
         dcl-ds AccountStatus ;
            PrimaryStatusCode                      varchar(20);
            SecondaryStatusCode                    varchar(20);
            AdditionalStatusCode                   varchar(20);
            PrimaryMessage                         varchar(20);
            SecondaryMessage                       varchar(20);
            AdditionalMessage                      varchar(20);
            NumberOfReturns                        varchar(20);
            LastReturnDate                         varchar(20);
            LastReturnReason                       varchar(20);
            StopAmount                             varchar(20);
            StopBeginningNumber                    varchar(20);
            StopEndNumber                          varchar(20);
            StopExpirationDate                     varchar(20);
            LastUpdated                            varchar(20);
            AdditionalClosedDate                   varchar(20);
            PreviousStatus                         varchar(20);
            FCRADisputeIndicator                   varchar(20);
            FCRADisputeAdditionalInformation       varchar(20);
            ScoredAccountsReason1                  varchar(20);
            ScoredAccountsReason2                  varchar(20);
            ScoredAccountsReason3                  varchar(20);
            ScoredAccountsReason4                  varchar(20);
            ScoredAccountsReason5                  varchar(20);
            RealTimeHighFocusResponseCode          varchar(20);
            RealTimeDuplicateItemResponseCode      varchar(20);
            ParticipantAccountScoreResponseCode    varchar(20);
            DisputeResponseCode                    varchar(20);
            dcl-ds AdditionalInformation ;
                 Code             varchar(50);
                 Message          varchar(50);
            end-ds AdditionalInformation ;
         end-ds AccountStatus;
         dcl-ds AccountDetails ;
            RoutingTransitNumber                   varchar(20);
            AccountNumber                          varchar(20);
            CheckSerialNumber                      varchar(20);
            Amount                                 varchar(20);
            CreditAccountRoutingNumber             varchar(20);
            CreditAccountNumber                    varchar(20);
            FeeAttribute                           varchar(20);
         end-ds AccountDetails ;
         dcl-ds Status ;
            StatusCode                             varchar(20);
            StatusMessage                          varchar(20);
            MoreInformation                        varchar(50);
            TransactionId                          varchar(50);
         end-ds Status ;
       end-ds Rqst;

       dcl-ds JSONCLOB_t qualified template;
          Length UNS(10) inz(0);
          Data char(1500000) inz(*blanks);
       end-ds;

       dcl-ds  *n PSDS;
          itemCount  Uns(20)  Pos(372);  // Populated by DATA-INTO
       end-ds;

       // Prototypes and Interface Defintions
       DCL-PR Entry extpgm('FRDR0001');
          JSONCLOB                    LIKEDS(JSONCLOB_t);
       END-PR;

       DCL-PI Entry;
          JSONCLOB                    LIKEDS(JSONCLOB_t);
       END-PI;

       // Program variables
       dcl-s   errNoLC          char(6);
       dcl-s   errMsgLC         char(100);
       dcl-s   JSONOptions      char(100);
       dcl-s   JSONIn           varchar(16773100);
       dcl-s   JSONOut          varchar(16773100);

       // Constants
       dcl-c   QUOTE            Const(x'7D');
       dcl-c   UpC              Const(' ABCDEFGHIJKLMNOPQRSTUVWXYZ');
       dcl-c   LowC             Const('~abcdefghijklmnopqrstuvwxyz');
       dcl-c   LF               Const(x'25');


       // Main Line
       //Clear Rqst;
       Clear JSONIn;
       Clear JSONOut;
       Clear FRDLOGOut;

       FRDLOGOut.JSNTIMEA = %TimeStamp();
       FRDLOGOut.Module = 'FRDR0001';
       FRDLOGOut.JSNLOGIN = %trim(JSONCLOB.Data);

       JSONIn =  %trim(JSONCLOB.Data) ;

       JSONOptions = ' doc=string countprefix=num_ trim=all ' +
                     ' case=any allowmissing=yes allowextra=yes ';

       Monitor;
                        
       // HERE is where it fails to parse......
        
        [b]  DATA-INTO Rqst
                %Data( JSONIn : JSONOptions )
                %PARSER('YAJL/YAJLINTO');[/b]

       On-Error;
          errNoLC = '400';
          errMsgLC = 'Bad Request';
          JSONOut = GenErr(errNoLC:errMsgLC);
          Clear JSONCLOB;
          JSONCLOB.Data = %Trim(JSONOut);
          JSONCLOB.Length = %Len(%Trim(JSONCLOB.Data));
          GenLog();
          Return;
       EndMon;

       FRDLOGOut.JSNTIMEB = %TimeStamp();

       Monitor;

       EXEC SQL
        INSERT INTO FRDP0001
               (
                OverallMatchScore,
                ConditionCode,
                FullNameMatch,
                FirstNameMatch,
                MiddleNameMatch,
                BusinessNameMatch,
                DateOfBirthMatch,
                SSNMatch,
                FullAddressMatch,
                AddressLine1Match,
                AddressLine2Match,
                CityMatch,
                StateMatch,
                ZipMatch,
                HomePhoneMatch,
                WorkPhoneMatch,
                IDTypeMatch,
                IDNoMatch,
                IDStateMatch,
                SignerOwnerMatch,
                NamePrefixMatch,
                NameSuffixMatch,
                PrimaryStatusCode,
                SecondaryStatusCode,
                AdditionalStatusCode,
                PrimaryMessage,
                SecondaryMessage,
                AdditionalMessage,
                NumberOfReturns,
                LastReturnDate,
                LastReturnReason,
                StopAmount,
                StopBeginningNumber,
                StopEndNumber,
                StopExpirationDate,
                LastUpdated,
                AdditionalClosedDate,
                PreviousStatus,
                FCRADisputeIndicator,
                FCRADisputeAdditionalInformation,
                ScoredAccountsReason1,
                ScoredAccountsReason2,
                ScoredAccountsReason3,
                ScoredAccountsReason4,
                ScoredAccountsReason5,
                RealTimeHighFocusResponseCode,
                RealTimeDuplicateItemResponseCode,
                ParticipantAccountScoreResponseCode,
                DisputeResponseCode,
                AdditionalInformationCode,
                AdditionalInformationMessage,
                StatusCode,
                StatusMessage,
                MoreInformation,
                TransactionId,
                RoutingTransitNumber,
                AccountNumber,
                CheckSerialNumber,
                Amount,
                CreditAccountRoutingNumber,
                CreditAccountNumber,
                FeeAttribute
               )
        VALUES (
                :AccountOwnershipMatch.OverallMatchScore,
                :AccountOwnershipMatch.ConditionCode,
                :AccountOwnershipMatch.FullNameMatch,
                :AccountOwnershipMatch.FirstNameMatch,
                :AccountOwnershipMatch.MiddleNameMatch,
                :AccountOwnershipMatch.BusinessNameMatch,
                :AccountOwnershipMatch.DateOfBirthMatch,
                :AccountOwnershipMatch.SSNMatch,
                :AccountOwnershipMatch.FullAddressMatch,
                :AccountOwnershipMatch.AddressLine1Match,
                :AccountOwnershipMatch.AddressLine2Match,
                :AccountOwnershipMatch.CityMatch,
                :AccountOwnershipMatch.StateMatch,
                :AccountOwnershipMatch.ZipMatch,
                :AccountOwnershipMatch.HomePhoneMatch,
                :AccountOwnershipMatch.WorkPhoneMatch,
                :AccountOwnershipMatch.IDTypeMatch,
                :AccountOwnershipMatch.IDNoMatch,
                :AccountOwnershipMatch.IDStateMatch,
                :AccountOwnershipMatch.SignerOwnerMatch,
                :AccountOwnershipMatch.NamePrefixMatch,
                :AccountOwnershipMatch.NameSuffixMatch,
                :AccountStatus.PrimaryStatusCode,
                :AccountStatus.SecondaryStatusCode,
                :AccountStatus.AdditionalStatusCode,
                :AccountStatus.PrimaryMessage,
                :AccountStatus.SecondaryMessage,
                :AccountStatus.AdditionalMessage,
                :AccountStatus.NumberOfReturns,
                :AccountStatus.LastReturnDate,
                :AccountStatus.LastReturnReason,
                :AccountStatus.StopAmount,
                :AccountStatus.StopBeginningNumber,
                :AccountStatus.StopEndNumber,
                :AccountStatus.StopExpirationDate,
                :AccountStatus.LastUpdated,
                :AccountStatus.AdditionalClosedDate,
                :AccountStatus.PreviousStatus,
                :AccountStatus.FCRADisputeIndicator,
                :AccountStatus.FCRADisputeAdditionalInformation,
                :AccountStatus.ScoredAccountsReason1,
                :AccountStatus.ScoredAccountsReason2,
                :AccountStatus.ScoredAccountsReason3,
                :AccountStatus.ScoredAccountsReason4,
                :AccountStatus.ScoredAccountsReason5,
                :AccountStatus.RealTimeHighFocusResponseCode,
                :AccountStatus.RealTimeDuplicateItemResponseCode,
                :AccountStatus.ParticipantAccountScoreResponseCode,
                :AccountStatus.DisputeResponseCode,
                :AdditionalInformation.Code,
                :AdditionalInformation.Message,
                :Status.StatusCode,
                :Status.StatusMessage,
                :Status.MoreInformation,
                :Status.TransactionId,
                :AccountDetails.RoutingTransitNumber,
                :AccountDetails.AccountNumber,
                :AccountDetails.CheckSerialNumber,
                :AccountDetails.Amount,
                :AccountDetails.CreditAccountRoutingNumber,
                :AccountDetails.CreditAccountNumber,
                :AccountDetails.FeeAttribute
               );
       On-Error;
          errNoLC = '500';
          errMsgLC = 'Internal Server Error';
          JSONOut = GenErr(errNoLC:errMsgLC);
          Clear JSONCLOB;
          JSONCLOB.Data = %Trim(JSONOut);
          JSONCLOB.Length = %Len(%Trim(JSONCLOB.Data));
          GenLog();
          Return;
       EndMon;

       errNoLC = '200';
       errMsgLC = 'Success';
       JSONOut = GenErr(errNoLC:errMsgLC);
       Clear JSONCLOB;
       JSONCLOB.Data = %Trim(JSONOut);
       JSONCLOB.Length = %Len(%Trim(JSONCLOB.Data));
       GenLog();
       Return;


      * ›                                                                     €
      * › ‚             Generate Error Return                               › €
      * ›                                                                     €
       dcl-proc GenErr;

         dcl-pi GenErr varchar(32766);
           errNoLC char(6);
           errMsgLC char(100);
         end-pi;

         dcl-s   merrNo           char(6);
         dcl-s   merrMsg          char(100);

         merrNo  = errNoLC;
         merrMsg = errMsgLC;
         Clear JSONOut;

         JSONOut = ' {"Status": { ' +
                  '"TransactionId": "f4674faa-2ef5-11ed-a261-0242ac120002", ' +
                  '"StatusCode": "' + %Trim(merrNo)  + '", ' +
                  '"StatusMessage": "' + %Trim(merrMsg) + '", ' +
                  '"MoreInformation": "' + %Trim(merrMsg) + '" ' +
                  '}' +
                  '}';

         Return JSONOut;

       end-proc;

       // _______________________________________________________________________
       // |             Generate Log Entry                                      |
       // |_____________________________________________________________________|
       DCL-PROC GenLog;

          FRDLOGOut.JSNTIMEC = %TimeStamp();
          FRDLOGOut.JSNLOGOT = %Trim(JSONCLOB.Data);

          If FRDLOGOut.JSNTIMEB = *LOVAL;
            FRDLOGOut.JSNTIMEB = FRDLOGOut.JSNTIMEC;
          ENDIF;

          Write RFRDLOG FRDLOGOut;
       //   Write FRDLOG FRDLOGOut;

       END-PROC GenLog;                                              
Scott Klement
Site Admin
Posts: 636
Joined: Sun Jul 04, 2021 5:12 am

Re: DATA-INTO returning 1002: parse error: trailing garbage█

Post by Scott Klement »

The origin of the trailing garbage is not obvious in your code. That said, I do see two potential problems.

1) You should not do this:

Code: Select all

JSONIn =  %trim(JSONCLOB.Data) ;
Why not? Because the CLOB has only promised you 'JSONCLOB.Len' characters of data... it has not promised that the entire JSONCLOB.DAta will be filled up. You are simply assuming that anything beyond the length it promises you will always be blanks, so you can remove them with %TRIM -- I am very skeptical of that conclusion.

You should do this instead:

Code: Select all

JSONIn =  %subst(JSONCLOB.Data:1:JSONCLOB.Len) ;
Or if you are expecting extra blanks that need to be removed:

Code: Select all

JSONIn =  %subst(JSONCLOB.Data:1:JSONCLOB.Len);
JSONIn = %trim(JSONIn);

2) You have a duplicate field in your JSON document. When I load your JSON into VS Code (or if you prefer, you can use the jsonlint.com website to do the same thing, or any other tool that understands json format) I see the following:
cardenej2.png
cardenej2.png (51.13 KiB) Viewed 2553 times
Scott Klement
Site Admin
Posts: 636
Joined: Sun Jul 04, 2021 5:12 am

Re: DATA-INTO returning 1002: parse error: trailing garbage█

Post by Scott Klement »

In any case, the error message simply means that there are additional characters after the closing } in your JSON document -- if my suggestion above doesn't work, you'll simply have to debug the program to see what is there and figure out why and how to handle it properly.
Post Reply