Wednesday, September 28, 2016

Javascript - Parsing JSON returns syntax error

Leave a Comment

I am getting an error when trying to parse JSON:

 SyntaxError: Unexpected token u in JSON at position 0(…)   eFormsAtoZIndex.aspx:6558 

Full Code: http://pastebin.com/LXpJN8GF

Relevant Code:

$(document).ready(function() {     var rebuild = getParameterByName("rebuild");     var createdStructures = $('#AtoZContentDiv').children().length;     if ((rebuild !== undefined && rebuild !== null && rebuild.indexOf("true") === 0) || (createdStructures === 0)) {         // clean up pre-existing data         cleanUp();          // create container structure         createFormLinkContainers();          // Call SP web services to retrieve the information and create the A to Z         retrieveListData();         completeInitialization();     } else {         try {             aggregateAll = jQuery.parseJSON($('#hdnAggregateAll').val());             console.log(jQuery.parseJSON($('#hdnAggregateAll').val()));             aggregatePersonal = jQuery.parseJSON($('#hdnAggregatePersonal').val());             aggregateBusiness = jQuery.parseJSON($('#hdnAggregateBusiness').val());             ministryAggregate = jQuery.parseJSON($('#hdnMinistryAggregate').val());             caAggregate = jQuery.parseJSON($('#hdnCAAggregate').val());             sTaxAggregate = jQuery.parseJSON($('#hdnSTaxAggregate').val());             bTaxAggregate = jQuery.parseJSON($('#hdnBTaxAggregate').val());             leTaxAggregate = jQuery.parseJSON($('#hdnLETaxAggregate').val());         } catch (err) {             console.log(err);         }          var type = getParameterByName("filter");     }     $("#tab-all").click(function() {         loadit('all');     });      $("#tab-business").click(function() {         loadit('business');     });      $(document).on('click', '#tab-personal', function(e) {         loadit('personal');     });      buildFilterMenu();     loadit('all');  });  function createJSONStructure(title, desc, index, type, formLink, documentLink, pubType, processId, ministry, ca, stax, btax, letax) {     if (desc !== undefined && desc !== null) {         desc = desc.replace(/&lt;/g, "<").replace(/&gt;/g, ">");     } else {         desc = "";     }     var typeArr = [];     type = type.replace(/&amp;/, "&");      var tempType = type.split("&");      for (i = 0; i < tempType.length; i++) {         typeArr.push(tempType[i].trim());     }      if (formLink === undefined || formLink === null || formLink.length === 0) {         formLink = "";     }      if (documentLink === undefined || documentLink === null || documentLink.length === 0) {         documentLink = "";     }      // subject, business and life event taxonomies must cater for multiple entries     var staxStructure = buildTaxonomyJSONStructure(stax, "stax");     var btaxStructure = buildTaxonomyJSONStructure(btax, "btax");     var letaxStructure = buildTaxonomyJSONStructure(letax, "letax");      var json = {         'name': title,         'desc': desc,         'type': typeArr,         'pubType': pubType,         'pdflink': documentLink.split(",")[0].replace(/\'/g, "&#39;"),         'formlink': formLink.split(",")[0].replace(/\'/g, "&#39;"),         'processid': processId,         'index': index,         'ministry': ministry.replace(/\,/g, " "),         'ca': ca.replace(/\,/g, " "),         'stax': staxStructure,         'btax': btaxStructure,         'letax': letaxStructure     };     return json; }    function completeInitialization() {     if (checkDataLoaded()) {         // add the Navigation to the containers once all the data is inserted         addNavigationToContainers();           var type = getParameterByName("filter");         if (type == null || type.length == 0) {             type = "all";         }          loadit(type);          buildFilterMenu();          filter(type);          $('#hdnAggregateAll').val(stringify(aggregateAll));         console.log(aggregateAll);         $('#hdnAggregatePersonal').val(stringify(aggregatePersonal));         $('#hdnAggregateBusiness').val(stringify(aggregateBusiness));         $('#hdnMinistryAggregate').val(stringify(ministryAggregate));         $('#hdnCAAggregate').val(stringify(caAggregate));         $('#hdnSTaxAggregate').val(stringify(sTaxAggregate));         $('#hdnBTaxAggregate').val(stringify(bTaxAggregate));         $('#hdnLETaxAggregate').val(stringify(leTaxAggregate));     } else {         retryCount += 1;          // Check that the maximum retries have not been exceeded         if (retryCount <= maxRetries) {             setTimeout("completeInitialization();", 1000 * retryCount);         }     } } 

Can anyone point out what is wrong with the JSON structure or JS or how I can debug items within it?

EDIT (As per Jaromanda X's and CH Buckingham reply):

$('#hdnAggregateAll').val(JSON.stringify(aggregateAll)); console.log(aggregateAll);          $('#hdnAggregatePersonal').val(JSON.stringify(aggregatePersonal));          $('#hdnAggregateBusiness').val(JSON.stringify(aggregateBusiness));          $('#hdnMinistryAggregate').val(JSON.stringify(ministryAggregate)); $('#hdnCAAggregate').val(JSON.stringify(caAggregate)); $('#hdnSTaxAggregate').val(JSON.stringify(sTaxAggregate)); $('#hdnBTaxAggregate').val(JSON.stringify(bTaxAggregate)); $('#hdnLETaxAggregate').val(JSON.stringify(leTaxAggregate)); 

ERROR:

10:42:24.274 TypeError: item is undefined createFormLinks/<()eformsAtoZIndex.aspx:5644 .each()jquery-1.11.1.min.js:2 createFormLinks()eformsAtoZIndex.aspx:5638 processResult()eformsAtoZIndex.aspx:5507 m.Callbacks/j()jquery-1.11.1.min.js:2 m.Callbacks/k.fireWith()jquery-1.11.1.min.js:2 x()jquery-1.11.1.min.js:4 .send/b()jquery-1.11.1.min.js:4 1eformsAtoZIndex.aspx:5644:1 

On line:

if (item.processid !== "0") 

In Block:

function createFormLinks(formItems, index)     {         // create all links on the page and add them to the AtoZContent div for now         var parentContainer = $("#AtoZContentDiv");          if (parentContainer === null)         {             // if it doesn't exist, we exist cause I can't reliably add a new control to the body and get the display              // location correct             return;         }          // sort form link array first         formItems = sortResults(formItems, 'name', true);          var count = 0;          $.each(formItems, function(i, item)         {                var link;             count = count + 1;              //add links to parent container             if (item.processid !== "0")             {                  link = item.formlink;             }             else if (item.pdflink !== "")             {                  link = item.pdflink;             }              var container = $("#AtoZContent-" + index);             var itemType = "all";              if (item.type !== null && item.type !== undefined && item.type.length === 1) itemType = item.type[0];                var str = "<div id='divFormLink-" + index + "-" + count + "' type='" + itemType + "' ";          if (item.name !== undefined && item.name !== null)             {                 str = str + " ministry='" + stripPunctuation(item.ministry) + "' ";                 str = str + " ca='" + stripPunctuation(item.ca) + "' ";                  // now, we need to handle these differently since they can have multiple values                 str = str + " stax='";                 for (i = 0; i < item.stax.length; i++)                 {                     str = str + stripPunctuation(item.stax[i]);                 }                 str = str + "' ";                  str = str + " btax='";                 for(i = 0; i < item.btax.length; i++)                 {                     str = str + stripPunctuation(item.btax[i]);                 }                 str = str + "' ";                  str = str + " letax='";                 for(i = 0; i < item.letax.length; i++)                 {                     str = str + stripPunctuation(item.letax[i]);                 }                 str = str + "' ";             }              str = str + " index='" + index + "' style='word-wrap: break-word;'></div>";         container.append(str);              var innerDiv = $("#divFormLink-" + index + "-" + count);             appendIcon(innerDiv, item.pubType);             innerDiv.append("<a id='formLink-" + index + "-" + count + "' href='" + link + "'>" + item.name + "</a>");             innerDiv.append("<div id='formDesc-" + index + "-" + count + "'>" + item.desc + "</div><br />");          });     } 

1 Answers

Answers 1

On the line 155 you push json even if it's undefined.

if (pubType=="eForm" || pubType=="PDF") {       var json = createJSONStructure(title, desc, index, type.toLowerCase(), formLink, documentLink, pubType, processId, ministry, ca, stax, btax, letax); } formItems.push(json); 

And after it your are trying to get item.processid of undefined. You can define variables in if-block, but in the case you should to add some validation.

$.each(formItems, function(i, item) {        var link;     count = count + 1;      if (item == null) {         return;     }      //add links to parent container     if (item.processid !== "0")     ... }); 
If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment