2013-09-11 3 views
1

У меня есть пара функций, которые анализируют внешние/внутренние данные JSON и возвращают их на локальную веб-страницу, используя localStorage. Теперь я получил данные внешнего JSON для правильного отображения, но не получил данные JSON, представленные локально, и получил ошибку JSON.parse: unexpected end of data. Функция, которая анализирует эти данные, равна retrieveData().JSON.parse: неожиданный конец данных (javascript)

Вот примеры того, что я пытаюсь сделать.

function saveData() { //This function take the data from the html inputs and put the values into local storage 
    getRadio(); 
    getCheckbox(); 
    localStorage.setItem("Categories", $("select").value); 
    localStorage.setItem("Name", $("Name").value); 
    localStorage.setItem("Rating", $("rating").value); 
    localStorage.setItem("Recommend", recommendValue); 
    localStorage.setItem("Favorite", Favorite); 
    localStorage.setItem("Date", $("date").value); 
    localStorage.setItem("Notes", $("notes").value); 
    alert("Resource Saved!"); 
} 

    function getRadio() { //This function takes the radio input; be it checked or unchecked 
    var radio = document.forms[0]; 
    for (var i = 0; i < radio.length; i++) { 
     if (radio[i].checked) { 
      Favorite = radio[i].value; 
     } 
    } 
} 

function getCheckbox() { //This function takes the value from recommend; either being yes or no 
    if ($("Y").checked) { 
     recommendValue = $("Y").value; 
    } 
    else { 
     recommendValue = $("N").value; 
    } 
} 

    function retrieveData() { //this function will retrieve the data in local storage or from json.js if their is no default data 
    toggle("on"); 
    if (localStorage.length === 0) { 
     alert("No data in localStorage. Adding default data."); 
     fillData(); 
    } 
    var Makediv = document.createElement('div'); 
    Makediv.setAttribute("id", "games"); 
    var list = document.createElement('ul'); 
    Makediv.appendChild(list); 
    document.body.appendChild(Makediv); 
    //ImageGrab($("Select").value, Div); 
    for (var i = 0; i < localStorage.length; i++) { 
     var mli = document.createElement('li'); 
     list.appendChild(mli); 
     var keyVal = localStorage.key(i); 
     var value = localStorage.getItem(keyVal); 
     //convert local storage value back into an object using JSON 
     var objct = JSON.parse(value); 
     var makesul = document.createElement('ul'); 
     mli.appendChild(makesul); 
     for (var q in objct) { 
      var msl = document.createElement('li'); 
      makesul.appendChild(msl); 
      var subText = objct[q][0] + " " + objct[q][1]; 
      msl.innerHTML = subText; 
     } 
    } 
} 

    function fillData() { //this function reads in json.js with Ajax 
    var xmlRequest; 
    if (window.XMLHttpRequest) { 
     // code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlRequest = new XMLHttpRequest(); 
    } 
    else { 
     // code for IE6, IE5 
     xmlRequest = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xmlRequest.onreadystatechange = function() { 
    if (xmlRequest.readyState == 4 && xmlRequest.status == 200) { 
     var text = xmlRequest.responseText; 
     var json = JSON.parse(text); 
    } 
    xmlRequest.open("GET", "json.js?_dc" + Math.random(), false); 
    xmlRequest.send(); 
    for (var i in json) { 
     var ID = Math.floor(Math.random() * 100000001); 
     localStorage.setItem(ID, JSON.stringify(json[i])); 
    } 
} 

    function $(x) { //this function gives me the ability to call an element easily. $("example") 
    var element = document.getElementById(x); 
    return element; 
} 

    var DisplayRatings = $('DisplayLink'); 
    DisplayRatings.addEventListener("click", retrieveData); //on-click display data 
    var SubmitRating = $('submit'); 
    SubmitRating.addEventListener("click", saveData, true); //on-click save the data 

Может ли кто-нибудь указать мне правильное направление? Я пробовал JSON.readyStatus === 4 и JSON.status === 200 до и безрезультатно (в инструкции if).

Мое ожидаемое значение этого результата поднимет это на уже сделанной странице addGame.html. Как вы можете видеть, предположим, что вы сделаете неупорядоченный список, а затем добавьте упорядоченные элементы списка с сохраненными данными JSON. Вот мой html, который принимает входные данные. файл

json.js

{ 
"Game1": { 
    "Categories": ["Categories:", "Xbox360"], 
    "Name": ["Name:", "Call of Duty: Modern Warfare"], 
    "Rating": ["Rating:", "7"], 
    "Recommend": ["Recommend:", "yes"], 
    "Favorite": ["Favorite:", "yes"], 
    "Date": ["Date:", "04-01-2010"], 
    "Notes": ["Notes:", "This is an FPS."] 
}, 
"Game2": { 
    "Categories": ["Categories:", "Playstation 4"], 
    "Name": ["Name:", "Defiance"], 
    "Rating": ["Rating:", "3"], 
    "Recommend": ["Recommend:", "no"], 
    "Favorite": ["Favorite:", "no"], 
    "Date": ["Date:", "04-07-2011"], 
    "Notes": ["Notes:", "Massive Multiplayer game."] 
}, 
"Game3": { 
    "Categories": ["Categories:", "Xbox360"], 
    "Name": ["Name:", "Call of Duty: Black Ops II"], 
    "Rating": ["Rating:", "8"], 
    "Recommend": ["Recommend:", "yes"], 
    "Favorite": ["Favorite:", "yes"], 
    "Date": ["Date:", "06-03-2011"], 
    "Notes": ["Notes:", "Great game."] 
}, 
"Game4": { 
    "Categories": ["Categories:", "PC"], 
    "Name": ["Name:", "Dark Souls"], 
    "Rating": ["Rating:", "9"], 
    "Recommend": ["Recommend:", "yes"], 
    "Favorite": ["Favorite:", "yes"], 
    "Date": ["Date:", "08-06-2011"], 
    "Notes": ["Notes:", "This game is extremely hard."] 
}, 
"Game5": { 
    "Categories": ["Categories:", "Playstation 4"], 
    "Name": ["Name:", "Resident Evil 6"], 
    "Rating": ["Rating:", "2"], 
    "Recommend": ["Recommend:", "no"], 
    "Favorite": ["Favorite:", "no"], 
    "Date": ["Date:", "08-01-2012"], 
    "Notes": ["Notes:", "This is not very great."] 
}, 
"Game6": { 
    "Categories": ["Categories:", "Wii"], 
    "Name": ["Name:", "Wii Sports"], 
    "Rating": ["Rating:", "5"], 
    "Recommend": ["Recommend:", "yes"], 
    "Favorite": ["Favorite:", "no"], 
    "Date": ["Date:", "08-02-2012"], 
    "Notes": ["Notes:", "Virtual Sports."] 
}, 
"Game7": { 
    "Categories": ["Categories:", "Mac"], 
    "Name": ["Name:", "Space Defenders"], 
    "Rating": ["Rating:", "6"], 
    "Recommend": ["Recommend:", "yes"], 
    "Favorite": ["Favorite:", "no"], 
    "Date": ["Date:", "08-03-2012"], 
    "Notes": ["Notes:", "This is a good casual game."] 
}, 
"Game8": { 
    "Categories": ["Categories:", "PC"], 
    "Name": ["Name:", "Spelunky"], 
    "Rating": ["Rating:", "10"], 
    "Recommend": ["Recommend:", "yes"], 
    "Favorite": ["Favorite:", "yes"], 
    "Date": ["Date:", "08-03-2013"], 
    "Notes": ["Notes:", "This is a randomly generated cave game."] 
}, 
"Game9": { 
    "Categories": ["Categories:", "Xbox360"], 
    "Name": ["Name:", "Spelunky"], 
    "Rating": ["Rating:", "10"], 
    "Recommend": ["Recommend:", "yes"], 
    "Favorite": ["Favorite:", "yes"], 
    "Date": ["Date:", "08-03-2012"], 
    "Notes": ["Notes:", "This is the xbox live arcade version that came out first, but had many xbox exclusives."] 
}, 
"Game10": { 
    "Categories": ["Categories:", "PC"], 
    "Name": ["Name:", "Prison Architect"], 
    "Rating": ["Rating:", "8"], 
    "Recommend": ["Recommend:", "yes"], 
    "Favorite": ["Favorite:", "yes"], 
    "Date": ["Date:", "08-03-2012"], 
    "Notes": ["Notes:", "This is a prison simulation game."] 
}, 
"Game11": { 
    "Categories": ["Categories:", "PC"], 
    "Name": ["Name:", "Don't Starve"], 
    "Rating": ["Rating:", "9"], 
    "Recommend": ["Recommend:", "yes"], 
    "Favorite": ["Favorite:", "yes"], 
    "Date": ["Date:", "08-04-2012"], 
    "Notes": ["Notes:", "This is horror survival game."] 
}, 
"Game12": { 
    "Categories": ["Categories:", "Wii"], 
    "Name": ["Name:", "Super Mario"], 
    "Rating": ["Rating:", "6"], 
    "Recommend": ["Recommend:", "yes"], 
    "Favorite": ["Favorite:", "no"], 
    "Date": ["Date:", "08-04-2012"], 
    "Notes": ["Notes:", "Not as good as the original."] 
}, 
"Game13": { 
    "Categories": ["Categories:", "Playstation 4"], 
    "Name": ["Name:", "uncharted 3"], 
    "Rating": ["Rating:", "6"], 
    "Recommend": ["Recommend:", "no"], 
    "Favorite": ["Favorite:", "no"], 
    "Date": ["Date:", "08-04-2012"], 
    "Notes": ["Notes:", "Hype didn't live up to expectations."] 
}, 
"Game14": { 
    "Categories": ["Categories:", "PC"], 
    "Name": ["Name:", "Dota 2"], 
    "Rating": ["Rating:", "9"], 
    "Recommend": ["Recommend:", "yes"], 
    "Favorite": ["Favorite:", "yes"], 
    "Date": ["Date:", "08-05-2012"], 
    "Notes": ["Notes:", "Great for pro players."] 
}, 
"Game15": { 
    "Categories": ["Categories:", "Xbox360"], 
    "Name": ["Name:", "EA MMA"], 
    "Rating": ["Rating:", "10"], 
    "Recommend": ["Recommend:", "yes"], 
    "Favorite": ["Favorite:", "yes"], 
    "Date": ["Date:", "08-06-2011"], 
    "Notes": ["Notes:", "Best fighting game ever!"] 
}, 
"Game16": { 
    "Categories": ["Categories:", "PC"], 
    "Name": ["Name:", "Papers, please"], 
    "Rating": ["Rating:", "6"], 
    "Recommend": ["Recommend:", "yes"], 
    "Favorite": ["Favorite:", "no"], 
    "Date": ["Date:", "08-07-2012"], 
    "Notes": ["Notes:", "This is a dystopian thiller."] 
}, 
"Game17": { 
    "Categories": ["Categories:", "Mac"], 
    "Name": ["Name:", "Star Wars: Knights of the Old Republic"], 
    "Rating": ["Rating:", "8"], 
    "Recommend": ["Recommend:", "yes"], 
    "Favorite": ["Favorite:", "no"], 
    "Date": ["Date:", "08-07-2009"], 
    "Notes": ["Notes:", "This is a classic."] 
}, 
"Game18": { 
    "Categories": ["Categories:", "PC"], 
    "Name": ["NRatingame:", "Counter Strike: Global Offensive"], 
    "Rating": ["Rating:", "7"], 
    "Recommend": ["Recommend:", "yes"], 
    "Favorite": ["Favorite:", "yes"], 
    "Date": ["Date:", "08-16-2012"], 
    "Notes": ["Notes:", "One of the best FPS on the market."] 
}, 
"Game19": { 
    "Categories": ["Categories:", "Wii"], 
    "Name": ["Name:", "007: Goldeneye"], 
    "Rating": ["Rating:", "4"], 
    "Recommend": ["Recommend:", "no"], 
    "Favorite": ["Favorite:", "no"], 
    "Date": ["Date:", "08-022-2012"], 
    "Notes": ["Notes:", "Controls are not very accesible."] 
}, 
"Game20": { 
    "Categories": ["Categories:", "PC"], 
    "Name": ["Name:", "Super Meat Boy"], 
    "Rating": ["Rating:", "10"], 
    "Recommend": ["Recommend:", "yes"], 
    "Favorite": ["Favorite:", "yes"], 
    "Date": ["Date:", "08-01-2012"], 
    "Notes": ["Notes:", "One of my favorite platformers."] 
} 

}

addGame.html

<!DOCTYPE HTML> 
<html> 
<div id="headAddGame"> 
    <head> 
     <meta charset="UTF-8"> 
     <meta keyword="Ratings, list, Gaming"> 
     <meta description="A form that will create a specific review for each game."> 
     <meta name="ROBOTS" content="INDEX, FOLLOW"> 
     <meta name="viewport" content="user-scalable=no, width=device-width"> 
     <link rel="stylesheet" type="text/css" href="styles.css"> 
     <script type="text/javascript" src="json.js"/></script> 
     <div id="titleAddGame"> 
      <title> 
       Add A Game 
      </title> 
     </div> 
    </head> 
</div> 
<div="bodyAddGame"> 
    <body class="bodystyle"> 
     <fieldset ID="field"> 
      <legend class="bodyLegend"> 
       Add Game 
      </legend> 
      <form action="#" method="post" id="form"> 
       <h1 class="gameh1"> 
         Select A Category: 
       </h1> 
       <select name="Category dropdown list" id="select"> 
       <option value="Select One">Select One!</option> 
       <option value="Xbox360">Xbox360</option> 
       <option value="Playstation 4">Playstation 4</option> 
       <option value="PC">PC</option> 
       <option value="Mac">Mac</option> 
       <option value="Wii">Wii</option> 
       </select> 
       <h1 class="hone"> 
        Game Information: 
       </h1> 
       <h2 class="htwo"> 
        Name: 
       </h2> 
       <input type="text" name="Name" id="Name"> 
       <h2 class="htwo"> 
        Rating (from one to ten, ten being the highest, one being the lowest): 
       </h2> 
       <input type="range" name="rating" min="1" max="10" id="rating"> 
       <h2 class="htwo"> 
        Would you recommend?: 
       </h2> 
       <label for="Y">Yes</label> 
       <input type="checkbox" name="recommend" id="Y" value="Yes"><br> 
       <label for="N">No</label> 
       <input type="checkbox" name="recommend" id="N" value="No"><br> 
       <br> 
       <label for="Fav"> 
        Save as a Favorite? 
       </label> 
       <br> 
       <input type="radio" name="Favorite" id="Fav" value="Yes"> 
       <br> 
       <h2 class="htwo"> 
        Date of review: 
       </h2> 
       <input type="date" name="date" id="date"> 
       <h2 class="htwo"> 
        Notes: 
       </h2> 
       <textarea rows="4" cols="50" id="notes"> 
       </textarea> 
       <input type="hidden" id="Dev" value="mobileDev"> 
       <br> 
       <br> 
       <input type="submit" value="submit" id="submit"> 
       <br> 
      </form> 
     </fieldset> 
    </body> 
</div> 
<div id="footAddGame"> 
    <footer> 
     <a href="#" ID="Clear"> 
      clear stored data 
     </a> 
     <a href="#" ID="DisplayLink"> 
      display data 
     </a> 
     <a href="addgame.html" id="Addgame" style="display:none;"> 
      Add New Item 
     </a> 
     <script type="text/javascript" src="main.js"/></script> 
    </footer> 
</div> 

результирующий выход при вызове функции retrieveData() следует добавить пример ниже на странице ,

Подобно этому:

  • Категория
    - имя
    - рейтинг
    - рекомендуем
    - любимый
    - отмечает

Тем не менее, мой полученный результат выходит так :


  • *
    *
    *
    *
    *

Я просто использую JavaScript, Ajax, HTML и CSS. По этой проблеме он имеет дело только с JavaScript и HTML (сохранение данных JSON из HTML, чтобы отобразить его на addGame.html).

EDIT: Также пробовал JSON.stringify() при чтении значений из представленной формы html. Произошла одна и та же ошибка.

+0

Предложение: добавьте немного больше контекста к вашему вопросу. Какова ваша ожидаемая отдача от реализованной продукции и почему вы думаете, что это может произойти?Трудно видеть из вашего кода, что именно происходит (особенно когда его просто большой блок без комментариев) =/ –

+1

Спасибо, Майк, я сделаю это. –

+0

Являются ли данные JSON, которые вы получаете, хорошо сформированы? Или есть буквально, как говорит ошибка, «неожиданный конец данных»? Запишите строку JSON как-то, например. 'console.log (json [i])' или введите URL-адрес json.js прямо в ваш браузер, чтобы проверить результат. – Snixtor

ответ

0

Содержание json.js - это javascript, не JSON. Вместо «var json = {» вы должны просто «{».

+0

Это не отвечает на мой вопрос, пожалуйста, прочитайте все комментарии до отправляя ответ. –

+0

Извините, но огромное количество кода, текста вопроса, изменений и комментариев затрудняет отслеживание вашей проблемы. Я сосредоточился на нескольких конкретных деталях, хотя ... ** 1 ** Ошибка JSON.parse: неожиданный конец. ** 2 ** По вашему мнению, объект в локальном хранилище находится в том же формате, что и файл js *. ** 3 ** JS-файл не содержит допустимого JSON и не будет 'JSON.parse'. Если это не отвечает на ваш вопрос, то я чувствую, что вы выиграете больше всего, перепросив свой вопрос и сосредоточившись только на строго необходимой детали ... – Snixtor

+0

Имейте в виду, что 'JSON.parse' - это функция, которая обычно только имеет один вход. * Только * соответствующие данные для диагностики этой ошибки - это вход в эту функцию. Если, как вы, кажется, говорите, вход в эту функцию является содержимым файла json.js, тогда он будет терпеть неудачу, потому что это недействительно JSON. Если ввод - это что-то еще, * вам нужно определить, что такое вход *. – Snixtor

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