Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Javascript - Parsing JSON returns syntax error

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 />");

        });
    }
like image 425
Brian Avatar asked Sep 19 '16 12:09

Brian


People also ask

How do you handle JSON parsing error?

Using try-catch block The most common way to handle JSON parse error is using try-catch block. If the JSON string is valid, it will return a JavaScript object. If the JSON string is invalid, it will throw a SyntaxError.

How do I fix JSON format error?

Follow these steps to resolve your invalid JSON formatting error. Verify that the service account credentials are in a valid JSON format. Tip: An online JSON formatter can identify problems with the JSON format. If the error persists, generate a new service account credentials key.

Why would JSON parse fail?

What went wrong? JSON. parse() parses a string as JSON. This string has to be valid JSON and will throw this error if incorrect syntax was encountered.

What does error parsing JSON response mean?

It means that the editor failed to get a response to the server or the response wasn't in a valid JSON format. Basically, if the editor can't communicate with the server, it will show this error message instead.


1 Answers

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")
    ...
});
like image 109
Anton Chukanov Avatar answered Sep 28 '22 06:09

Anton Chukanov