Con i browser moderni è possibile eseguire delle chiamate ajax in JavaScript senza l'utilizzo di librerie esterne.
La chiamata può essere fatta tramite l'oggetto XMLHttpRequest presente in tutti ibrowser.

La funzione sgart.jsonGet è un esempio di chiamata ajax di tipo GET per ottenere in risposta un oggetto json:
var sgart = sgart || {};
/* 
 * Sgart.it - chiamata ajax in GET
 * url: url del servizio da chiamare con eventuali parametri in query string
 * fnCallbackOk: funzione richiamata in caso di successo
 * fnCallbackError: funzione richiamata in caso di errore
 */
sgart.jsonGet = function (url, fnCallbackOk, fnCallbackError) {
  // creo l'oggetto per la chiamata
  var xHttp = new XMLHttpRequest();
  // gestisco la callback di risposta
  xHttp.onreadystatechange = function () {
    if (this.readyState === 4) {
      if (this.status === 200) {
        if (typeof fnCallbackOk === "function") {
          // se ho un  200 tutto ok, 
          // chiamo la funzione passata di callback passandogli l'oggetto json
          fnCallbackOk(JSON.parse(this.responseText));
        } else {
          // se non ho passato una funzione stampo un warning in console;
          console.log("warning: reponse ok but no calback function", url);
        }
      } else {
        // se sono qui c'è stato un errore, lo scrivo sempre in console
        console.log("Error", url, this.status, this.responseText);
        if (typeof fnCallbackError === "function") {
          // se esiste chiamo la callback di errore
          fnCallbackError(this.status, this.responseText);
        }
      }
    }
  };
  // inposto la chiamata in GET asincrona (true)
  xHttp.open("GET", url, true);
  // imposto il content type per le chiamate json
  xHttp .setRequestHeader("Content-type", "application/json");
  // eseguo la chiamata
  xHttp.send();
};
la funzione può essere usata in questo modo:
sgart.jsonGet(
  './sgart-template-examples.json', 
  function (responseJson) { 
    console.log('ok', responseJson)
  },
  function (status, responseText) { 
    console.log('error', status, responseText)
  }
);
allo stesso modo si possono gestire le chiamate in POST tramite la funzione sgart.jsonPost:
/* 
 * Sgart.it - chiamata ajax in POST
 * url: url del servizio da chiamare
 * jsonObject: oggetto javascript
 * fnCallbackOk: funzione richiamata in caso di successo
 * fnCallbackError: funzione richiamata in caso di errore
 */
sgart.jsonPost = function (url, jsonObject, fnCallbackOk, fnCallbackError) {
  var xHttp = new XMLHttpRequest();
  xHttp.onreadystatechange = function () {
    if (this.readyState === 4) {
      if (this.status === 200) {
        if (typeof fnCallbackOk === "function") {
          fnCallbackOk(JSON.parse(this.responseText));
        } else {
          console.log("warning: reponse ok but no calback function", url);
        }
      } else {
        console.log("Error", url, this.status, this.responseText);
        if (typeof fnCallbackError === "function") {
          fnCallbackError(this.status, this.responseText);
        }
      }
    }
  };
  // imposto la chiamata in POST asincrona
  xHttp.open("POST", url, true);
  xHttp.setRequestHeader("Content-type", "application/json");
  // serializzo l'oggetto json in stringa
  var data = JSON.stringify(jsonObject);
  // invio la chiamata in post con la stringa che rappresenta il json
  xHttp.send(data);
};
l'uso della funzione sarà:
// oggetto da passare in post
var data = {
  id: 1,
  title: 'prova post'
};

sgart.jsonPost('./api/save', data, function (responseJson) { 
    console.log('ok', responseJson)
  }
  /* se non serve posso evitare la callback di errore
     l'eventuale errore verrà comunque scritto in console  */
);