2016-09-19 10 views
10

Я получаю сообщение об ошибке при попытке разобрать JSON:Javascript - Разбор JSON возвращает ошибку синтаксиса

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

Полный код: http://pastebin.com/LXpJN8GF

Соответствующий код:

$(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); 
     } 
    } 
} 

Может кто-нибудь указать на что не так с структурой JSON или JS или как я могу отлаживать элементы внутри него?

EDIT (В соответствии с ответом Jaromanda X-х и СН Букингемском):

$('#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)); 

ОШИБКА:

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 

В строке:

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

В блоке:

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

     }); 
    } 
+3

одной стороны, если нуль, или номер, или логическое, или дата, или что-нибудь, что это не объект передается в вашей stringify функции, она возвращает 'undefined' - что, когда принуждают строка даст вам эту точную ошибку, когда вы попытаетесь ее проанализировать. Почему вы усложняете функцию stringify, если ожидается, что она вернет строку JSON? просто используйте JSON.stringify и сделайте с ним. –

+0

Согласитесь с Jaromanda X, удалите свой собственный stringify, используйте JSON.stringify. Посмотрите, исчезла ли ваша проблема. –

+0

@CHBuckingham Я получаю ошибку типа: 'TypeError: item undefined'. См. Обновленный вопрос о внесенных изменениях. – Brian

ответ

10

На линии 155 вы нажимаете json, даже если он не определен.

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

И после этого ваш пытаются получить item.processid неопределенной. Вы можете определить переменные в if-блоке, но в этом случае вы должны добавить некоторую проверку.

$.each(formItems, function(i, item) { 
    var link; 
    count = count + 1; 

    if (item == null) { 
     return; 
    } 

    //add links to parent container 
    if (item.processid !== "0") 
    ... 
}); 
+0

Я не знаю, что делает черт Брайан, или почему он не ответил на этот ответ правильно, это должно было быть актуальным вопросом в то время. Это, безусловно, правильный ответ. – TylerY86

Смежные вопросы