2016-09-19 3 views
10

Ich erhalte eine Fehlermeldung, wenn sie versuchen JSON zu analysieren:Javascript - Parsing JSON gibt Syntaxfehler

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

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

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

Kann jemand darauf hinweisen, Was ist los mit der JSON-Struktur oder JS oder wie kann ich Elemente darin debuggen?

EDIT (Stand Jaromanda X und CH Buckingham Antwort):

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

Online:

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

     }); 
    } 
+3

für eine Sache, wenn null oder eine Zahl oder ein Boolean, oder ein Datum, oder etwas, das nicht ein Objekt ist, wird an Ihre stringify Funktion übergibt, gibt es 'undefined' - die, wenn sie dazu gezwungen zu Eine Zeichenfolge gibt Ihnen genau diesen Fehler, wenn Sie versuchen, es zu analysieren. Warum verkomplizieren Sie Ihre Stringify-Funktion, wenn erwartet wird, dass eine JSON-Zeichenfolge zurückgegeben wird? Verwenden Sie einfach JSON.stringify und machen Sie damit –

+0

Agree mit Jaromanda X, entfernen Sie Ihre benutzerdefinierte stringify, verwenden Sie JSON.stringify. Sehen Sie, ob Ihr Problem verschwindet. –

+0

@CHBuckingham Ich erhalte einen Typfehler: 'TypeError: item is undefined'. Siehe aktualisierte Frage für die Änderungen, die ich vorgenommen habe. – Brian

Antwort

10

Auf der Linie 155 drücken Sie json, auch wenn es nicht definiert ist.

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

Und nachdem es Ihre versuchen item.processid undefinierter zu bekommen. Sie können Variablen in if-block definieren, aber in dem Fall sollten Sie eine Validierung hinzufügen.

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

    if (item == null) { 
     return; 
    } 

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

Ich weiß nicht, was zum Teufel Brian macht, oder warum er diese Antwort nicht korrekt markiert hat, das musste zu der Zeit eine dringende Angelegenheit gewesen sein. Dies ist eindeutig die (einzige) richtige Antwort. – TylerY86