1

I have a couple functions that parse the external/internal JSON data and return it onto the local webpage using localStorage. Now I have gotten the external JSON data to display correctly, but have not gotten the JSON data submitted locally and get a JSON.parse: unexpected end of data error. The function that parses this data is retrieveData().

Here are examples of what I'm trying to do.

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

Can anyone point me in the right direction? I've tried JSON.readyStatus === 4 and JSON.status === 200 before and to no avail (in an if statement).

My expected output of this is bring this up under the already made addGame.html page. As you can see it is suppose to make an unordered list then add ordered list items with the saved JSON data. Here is my html that take the inputs.

json.js file

{
"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>

the resulting output when calling the retrieveData() function should add the example below to the page.

Similar to this:

  • Category
    - name
    - rating
    - recommend
    - favorite
    - notes

Yet, my resulting outcome comes out like this:


  • *
    *
    *
    *
    *

I'm just using JavaScript, Ajax, HTML, and CSS. On the problem it just deals with JavaScript and HTML (saving JSON data from the HTML to then display it on addGame.html).

EDIT: Also tried JSON.stringify() when reading in the values from the submitted html form. Same error occured.

Mr. Hargrove
  • 519
  • 1
  • 6
  • 26
  • A suggestion: and add a bit more context to your question. What is your expected output vs realized output and why do you think this might be happening? It's hard to see from your code what is exactly going on (especially when its just a big block with no comments) =/ – Mike H. Sep 11 '13 at 19:00
  • Is the JSON data you're receiving well formed? Or is there quite literally, as the error says, an "unexpected end of data"? Log the JSON string somehow, e.g. `console.log(json[i])`, or type the URL for json.js directly into your browser to examine the result. – Snixtor Sep 11 '13 at 21:11
  • Better yet, what framework are you using and how is the server interpreting the JSON? If it's ASP/MVC you can take a look at the resulting string in Chrome Dev tools under network (similar in firebug I assume) from the method that returns the JSON. EDIT: I like how Kolink deleted his comments and edited ours after being an ass...only thing wrong with SO with users that have so many points. – Mike H. Sep 12 '13 at 12:02
  • Thanks for adding json.js =)...makes sense now – Mike H. Sep 12 '13 at 13:54
  • No problem. That is only the default data in case the user hasn't submitted any data when clicking the display link. – Mr. Hargrove Sep 12 '13 at 13:55
  • I don't think I would use XMLHttpRequest for this. Have you taken a look at $.getJSON() or $.ajax()? Take a look here: http://api.jquery.com/jQuery.getJSON/ Your code will be less verbose and easier to debug in the long run...and it doesnt look like you are using XML anyway :P That's, of course, assuming you are cool with jQuery – Mike H. Sep 12 '13 at 13:57
  • I will get to work on that, any thoughts on submitting from the html file which saves into `localStorage`, then when you press the display link, that it skips the `fillData()` function (suppose to when you have submitted data manually), yet can't print out any of the values? – Mr. Hargrove Sep 12 '13 at 14:02
  • so if FillData gets called (due to lack of manual entries), everything displays ok? – Mike H. Sep 12 '13 at 14:53
  • Yes, that is correct. – Mr. Hargrove Sep 12 '13 at 15:13
  • http://stackoverflow.com/questions/2010892/storing-objects-in-html5-localstorage – Mike H. Sep 12 '13 at 15:27
  • So it could be the fact that I'm not stringify all the values? I'll try it out. – Mr. Hargrove Sep 12 '13 at 16:08
  • Howd that work out for ya? – Mike H. Sep 13 '13 at 12:10
  • It did not work, I still got the same `JSON.parse: Unexpected end of data` – Mr. Hargrove Sep 13 '13 at 12:32
  • Well the problem has to be how you are storing the information. Is there a way for you to see a string representation of localstorage? (I haven't dipped into that part of HTML5 yet) – Mike H. Sep 13 '13 at 14:22
  • Using the firebug console I look into `localStorage` and the entire object that was read in is there in its entirety. – Mr. Hargrove Sep 13 '13 at 17:37
  • let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/37361/discussion-between-mike-hometchko-and-jonbecher) – Mike H. Sep 13 '13 at 19:01

1 Answers1

0

The content in json.js is javascript, not JSON. Instead of 'var json = {' you should just have '{'.

Snixtor
  • 4,239
  • 2
  • 31
  • 54
  • This does not answer my question, please read all comments before posting an answer. – Mr. Hargrove Oct 14 '13 at 15:36
  • I'm sorry but the massive amounts of code, question text, revisions and comments make it a little difficult to track down your issue. I've focused on a few particular details though... **1** Error is JSON.parse: unexpected end. **2** According to you, the object in local storage is in *same format as the js file*. **3** The JS file does not contain valid JSON, and would fail `JSON.parse`. If this doesn't answer your question, then I feel you'd benefit most by re-asking your question and focusing only on the strictly necessary detail... – Snixtor Oct 14 '13 at 20:54
  • Keep in mind, `JSON.parse` is a function that typically only has one input. The *only* relevant details for diagnosing this error, is the input to that function. If, as you appear to be saying, the input to that function is the content of the json.js file, then it will fail because that is not valid JSON. If the input is something else, *you need to determine what the input is*. – Snixtor Oct 14 '13 at 20:56
  • I do not mean to cut you down, because you have made huge strides in giving me an answer, and I appreciate that greatly. Alas, if you'd read the comments, you'd see that many people asked me to show my code after I'd only put in what I strictly needed to know. Also, you were correct in saying that I had the incorrect format for the JSON file, but `JSON.parse` would return the `localStorage` in JSON format, yet it does not work. That is my question of why it is not working. – Mr. Hargrove Oct 15 '13 at 12:39
  • Just reading the non-code section of my question should give you an explanation of what I'm trying to do, and that can be read in 2 minutes or less. – Mr. Hargrove Oct 15 '13 at 12:40