Regarding the processing of gs.xmlToJSON

N_Y_1014
Tera Contributor

Thank you for your help.

 

I am trying to implement a process to convert XML to JSON objects and insert users into the sys_user table.

 

var xmlStr_multiple = "";
xmlStr_multiple += "<Names>";
xmlStr_multiple += "  <Name>";
xmlStr_multiple += "    <user_name>test1</user_name>";
xmlStr_multiple += "    <FirstName>John</FirstName>";
xmlStr_multiple += "    <LastName>Smith</LastName>";
xmlStr_multiple += "  </Name>";
xmlStr_multiple += "  <Name>";
xmlStr_multiple += "    <user_name>test2</user_name>";
xmlStr_multiple += "    <FirstName>James</FirstName>";
xmlStr_multiple += "    <LastName>White</LastName>";
xmlStr_multiple += "  </Name>";
xmlStr_multiple += "</Names>";

var xmlStr_single = "";
xmlStr_single += "<Names>";
xmlStr_single += "  <Name>";
xmlStr_single += "    <user_name>test1</user_name>";
xmlStr_single += "    <FirstName>John</FirstName>";
xmlStr_single += "    <LastName>Smith</LastName>";
xmlStr_single += "  </Name>";
xmlStr_single += "</Names>";


var xmlObj_multiple = gs.xmlToJSON(xmlStr_multiple);
var user_multiple = xmlObj_multiple.Names.Name;

var xmlObj_single = gs.xmlToJSON(xmlStr_single);
var user_single = xmlObj_single.Names.Name;

gs.info("Multiple Insertion ⇒" + JSON.stringify(user_multiple));
gs.info("Object.keys() ⇒" + Object.keys(user_multiple));
gs.info("Object.keys().length ⇒" + Object.keys(user_multiple).length);

gs.info("Single Insertion ⇒" + JSON.stringify(user_single));
gs.info("Object.keys() ⇒" + Object.keys(user_single));
gs.info("Object.keys().length ⇒" + Object.keys(user_single).length);


for (var i=0; i < Object.keys(user_multiple).length; i++) {

//User insertion process

}

for (var i=0; i < Object.keys(user_single).length; i++) {

//User insertion process

}

 

However, I have confirmed that the gs.xmlToJSON process is different when the XML content is single or multiple.

 

When processing multiple users, it has an array[], but when processing a single user, it does not have an array[].

 

This causes the values passed in Object.keys() and Object.keys().length to be different.

 

Is there any good workaround or alternative to this as we would like to register users using the conditional processing described in the for statement as much as possible?

*** Script: Multiple Insertion ⇒[{"user_name":"test1","FirstName":"John","LastName":"Smith"},{"user_name":"test2","FirstName":"James","LastName":"White"}]
*** Script: Object.keys() ⇒0,1
*** Script: Object.keys().length ⇒2

*** Script: Single Insertion ⇒{"user_name":"test1","FirstName":"John","LastName":"Smith"}
*** Script: Object.keys() ⇒user_name,FirstName,LastName
*** Script: Object.keys().length ⇒3

 

Thank you in advance.

1 ACCEPTED SOLUTION

palanikumar
Mega Sage

You can use Array.isArray function to check whether your object is array or not. Convert to array if identified as not array. Refer the script below:

var xmlStr_multiple = "";
xmlStr_multiple += "<Names>";
xmlStr_multiple += "  <Name>";
xmlStr_multiple += "    <user_name>test1</user_name>";
xmlStr_multiple += "    <FirstName>John</FirstName>";
xmlStr_multiple += "    <LastName>Smith</LastName>";
xmlStr_multiple += "  </Name>";
xmlStr_multiple += "  <Name>";
xmlStr_multiple += "    <user_name>test2</user_name>";
xmlStr_multiple += "    <FirstName>James</FirstName>";
xmlStr_multiple += "    <LastName>White</LastName>";
xmlStr_multiple += "  </Name>";
xmlStr_multiple += "</Names>";

var xmlStr_single = "";
xmlStr_single += "<Names>";
xmlStr_single += "  <Name>";
xmlStr_single += "    <user_name>test1</user_name>";
xmlStr_single += "    <FirstName>John</FirstName>";
xmlStr_single += "    <LastName>Smith</LastName>";
xmlStr_single += "  </Name>";
xmlStr_single += "</Names>";

var xmlObj_multiple = gs.xmlToJSON(xmlStr_multiple);
var user_multiple = xmlObj_multiple.Names.Name;
gs.info(Array.isArray(user_multiple));
if(!Array.isArray(user_multiple))
   user_multiple = [user_multiple];

var xmlObj_single = gs.xmlToJSON(xmlStr_single);
var user_single = xmlObj_single.Names.Name;
gs.info(Array.isArray(user_single));
if(!Array.isArray(user_single))
   user_single = [user_single];

gs.info("Multiple Insertion ⇒" + JSON.stringify(user_multiple));
gs.info("Object.keys() ⇒" + Object.keys(user_multiple));
gs.info("Object.keys().length ⇒" + Object.keys(user_multiple).length);

gs.info("Single Insertion ⇒" + JSON.stringify(user_single));
gs.info("Object.keys() ⇒" + Object.keys(user_single));
gs.info("Object.keys().length ⇒" + Object.keys(user_single).length);
Thank you,
Palani

View solution in original post

2 REPLIES 2

palanikumar
Mega Sage

You can use Array.isArray function to check whether your object is array or not. Convert to array if identified as not array. Refer the script below:

var xmlStr_multiple = "";
xmlStr_multiple += "<Names>";
xmlStr_multiple += "  <Name>";
xmlStr_multiple += "    <user_name>test1</user_name>";
xmlStr_multiple += "    <FirstName>John</FirstName>";
xmlStr_multiple += "    <LastName>Smith</LastName>";
xmlStr_multiple += "  </Name>";
xmlStr_multiple += "  <Name>";
xmlStr_multiple += "    <user_name>test2</user_name>";
xmlStr_multiple += "    <FirstName>James</FirstName>";
xmlStr_multiple += "    <LastName>White</LastName>";
xmlStr_multiple += "  </Name>";
xmlStr_multiple += "</Names>";

var xmlStr_single = "";
xmlStr_single += "<Names>";
xmlStr_single += "  <Name>";
xmlStr_single += "    <user_name>test1</user_name>";
xmlStr_single += "    <FirstName>John</FirstName>";
xmlStr_single += "    <LastName>Smith</LastName>";
xmlStr_single += "  </Name>";
xmlStr_single += "</Names>";

var xmlObj_multiple = gs.xmlToJSON(xmlStr_multiple);
var user_multiple = xmlObj_multiple.Names.Name;
gs.info(Array.isArray(user_multiple));
if(!Array.isArray(user_multiple))
   user_multiple = [user_multiple];

var xmlObj_single = gs.xmlToJSON(xmlStr_single);
var user_single = xmlObj_single.Names.Name;
gs.info(Array.isArray(user_single));
if(!Array.isArray(user_single))
   user_single = [user_single];

gs.info("Multiple Insertion ⇒" + JSON.stringify(user_multiple));
gs.info("Object.keys() ⇒" + Object.keys(user_multiple));
gs.info("Object.keys().length ⇒" + Object.keys(user_multiple).length);

gs.info("Single Insertion ⇒" + JSON.stringify(user_single));
gs.info("Object.keys() ⇒" + Object.keys(user_single));
gs.info("Object.keys().length ⇒" + Object.keys(user_single).length);
Thank you,
Palani

@palanikumar 

Sorry for the delay in replying.
I was able to achieve the requirement using the Array.isArray method.
Thank you very much.