20

I am using JSON to transfer data.

What do I need in my HTML page to read a file with Ajax that only includes one JSON object into my script?

Do I need jQuery too, or is it possible to load that JSON file with Ajax?

Is it different on different browsers?

2
  • jQuery makes Ajax easier, as do many other libraries, but you can do Ajax with Vanilla JS. Commented Jan 17, 2013 at 21:31
  • You have a static file on your web server that contains serialized JSON data, and you want to read that data using AJAX? Commented Jan 17, 2013 at 21:31

4 Answers 4

62

You don't need any library, everything is available in vanilla javascript to fetch a json file and parse it :

function fetchJSONFile(path, callback) {
    var httpRequest = new XMLHttpRequest();
    httpRequest.onreadystatechange = function() {
        if (httpRequest.readyState === 4) {
            if (httpRequest.status === 200) {
                var data = JSON.parse(httpRequest.responseText);
                if (callback) callback(data);
            }
        }
    };
    httpRequest.open('GET', path);
    httpRequest.send(); 
}

// this requests the file and executes a callback with the parsed result once
//   it is available
fetchJSONFile('pathToFile.json', function(data){
    // do something with your data
    console.log(data);
});
Sign up to request clarification or add additional context in comments.

6 Comments

As long as you don't need to support IE 5 and 6
You might want to add || httpRequest.status === 0 (for local connections). That really tripped me up when I was starting to learn xmlhttprequest
@JuanMendes The only thing this code would need to support older versions of IE is var httpRequest = (window.XMLHttpRequest)?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP"); But, who cares about older versions of IE? ;)
Thank you, this did what I needed as a Javascript beginner, and is simpler than other solutions I've seen. I like having the anonymous function there instead of a third, separate function.
I wouldn't parse the json if I knew the callback wasn't a function.
|
3

The most efficient way is to use plain JavaScript:

var a = new XMLHttpRequest();
a.open("GET","your_json_file",true);
a.onreadystatechange = function() {
  if( this.readyState == 4) {
    if( this.status == 200) {
      var json = window.JSON ? JSON.parse(this.reponseText) : eval("("+this.responseText+")");
      // do something with json
    }
    else alert("HTTP error "+this.status+" "+this.statusText);
  }
}
a.send();

1 Comment

This code works, but beware a wrong path will result in "NS_ERROR_DOM_BAD_URI: Access to restricted URI denied" making it look like the code doesn't work.
1

In the past, Ajax was different in different browsers (and still is if you need to support older browsers which a good number of users are unfortunately still using). For older browsers, you would need a library like JQuery (or your own equivalent code) to handle the browser differences. In any case, for a beginner, I might recommend jQuery for good docs, a simple API, and getting started quickly, though MDN is helpful for JavaScript itself too (and you really should increasingly get to understand JavaScript/DOM APIs even if you primarily rely on jQuery).

Comments

1

I prefer to use ajax jquery. Jquery makes live a lot easier.

What you for example can do on the server side is, i assume you're using php:

if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'){
    // if it's an ajax request

    $json['success'] = 1;
    $json['html'] = '<div id="test">..[more html code here].. </div>';
    echo json_encode($json);
}else{
    // if it's an non ajax request


}

At the client side you can do the following using jquery ajax:

    $.ajax({
          type: "POST",
          url: "[your request url here]",
          data: { name: "JOKOOOOW OOWNOOO" },
          complete: function(e, xhr, settings){
              switch(e.status){
                  case 500:
                     alert('500 internal server error!');
                     break;
                  case 404:
                      alert('404 Page not found!');
                     break;
                  case 401:
                      alert('401 unauthorized access');     
                     break;       
              }
          }           
        }).done(function( data ) {
            var obj = jQuery.parseJSON(data)

            if (obj.success == 1){

                  $('div#insert_html_div').html(obj.html);

            }else if (obj.error == 1){


                            }


            // etc

        });

1 Comment

Not the answer but still worth mentioning as alternative

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.