Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

Json returns null

thecoywwlf
Kilo Contributor

Hello,

I've followed the tutorial located at https://fruitionpartners.eu/blog/2015/11/17/glideajax-return-multiple-values-using-json/ but my JSON object still returns "null".

Is there something wrong with my script below? Thank you.

Serverside script

//----------------------------------

      var MyBiCustomAjax = Class.create();

      MyBiCustomAjax.prototype = Object.extendsObject(global.AbstractAjaxProcessor, {

              grantsBiQueries: function() {

                      var grantsBi = new GlideRecord('x_snc_grantsbi_grant');

                      grantsBi.orderByDesc('program_title'); //orders by program title

                      grantsBi.query();

                      var array = [];

                      while(grantsBi.next()) {

                              var object = {};

                              object.shortName = grantsBi.getDisplayValue('office_short_name');//Grabs all short names

                              object.cfda = grantsBi.getDisplayValue('cfda').toString();//Grabs numbers

                              array.push(object);

                      }

                        var json = new JSON();

                        var data = json.encode(array); //JSON formatted string

                      return data;

              },

              type: 'MyBiCustomAjax'

      });

//-------------------------------------------------------

1 ACCEPTED SOLUTION

Chuck Tomasi
Tera Patron

A couple suggestions David.



First, rename 'array' to something else. I know 'Array' is a keyword, but try to avoid naming variables as keywords (even if they are case sensitive.)   Name it something like "arr" or "myArray".



Second, Throw a debug statement in right after your grantsBi.query() to ensure you are counting the records properly. gs.log(grantsBi.getRowCount() + ' rows returned'); should provide some interesting output. You can find it in System Logs> System Log> Script Log Statements.



Third, change these lines:



                        var json = new JSON();


                        var data = json.encode(array); //JSON formatted string


                        return data;



to this



                        var answer = JSON.stringify(myArray); // or whatever you called array


                        gs.log('Here is the output: ' + answer);


                        return answer;


View solution in original post

13 REPLIES 13

sergiu_panaite
ServiceNow Employee
ServiceNow Employee

I would test the function in the background scripts and add some gs.log statements to see what is happening.



For example:



var grantsBi = new GlideRecord('x_snc_grantsbi_grant');


                      grantsBi.orderByDesc('program_title'); //orders by program title


                      grantsBi.query();



                            //lets see how many rows we get back


                        gs.log(grantsBi.getRowCount());



                      var array = [];




                      while(grantsBi.next()) {


                              var object = {};


                              object.shortName = grantsBi.getDisplayValue('office_short_name');//Grabs all short names


                              object.cfda = grantsBi.getDisplayValue('cfda').toString();//Grabs numbers


                              array.push(object);


                      }


                        var json = new JSON();


                        var data = json.encode(array); //JSON formatted string


                 


                            //lets see if there is anything in the data object


                            gs.log(data);



Regards,


Chuck Tomasi
Tera Patron

A couple suggestions David.



First, rename 'array' to something else. I know 'Array' is a keyword, but try to avoid naming variables as keywords (even if they are case sensitive.)   Name it something like "arr" or "myArray".



Second, Throw a debug statement in right after your grantsBi.query() to ensure you are counting the records properly. gs.log(grantsBi.getRowCount() + ' rows returned'); should provide some interesting output. You can find it in System Logs> System Log> Script Log Statements.



Third, change these lines:



                        var json = new JSON();


                        var data = json.encode(array); //JSON formatted string


                        return data;



to this



                        var answer = JSON.stringify(myArray); // or whatever you called array


                        gs.log('Here is the output: ' + answer);


                        return answer;


Both great answers so far. I'm definately familiar with the browser(chrome/firebug) debugging tools but haven't delved much into Servicenow. This will be my first introduction into SN debugging so will let you know how it goes tomorrow. Sorry. I feel so inept at SN right now. Oh also, great tutorials Chuck.


So I've narrowed down the culprit to the object in the loop.



       


            var arr = [];


                      while(grantsBi.next()) {


                              var object = {};


                              object.shortName = grantsBi.getDisplayValue('office_short_name');//Grabs all short names


                              object.cfda = grantsBi.getDisplayValue('cfda').toString();//Grabs numbers


                              arr.push(object);


                      }



Result


The results of the loop above is:


[object Object],[object Object],[object Object]......



instead of



[


{"shortName":"OESE",


"cfda":"123"}


]



Am I doing something wrong?