javascriptjsondojoxmlhttprequestdojo.xhrget

dojo xhr request new syntax doesn't load data as expected


Like the title says I am using the new dojo syntax for the dojo/request/xhr, but this doesn't seem to work and throws an error while loading data while the old syntax with the same url gives the wanted result.

This is the current syntax which doesn't load data correctly:

    this.get = function (url, loadFunc, errorFunc, handleFunc) {
        xhr( url, {
            handleAs: 'json'
        }).then(function(data){
            typeof loadFunc === 'function' ? loadFunc : function () { };
            console.log(url+ " load");
            console.log(data);
        }, function(error){
            typeof errorFunc === 'function' ? errorFunc : function () {  };
            console.log(url+" error");
            console.dir(error);
        }, function(handle){
            typeof handleFunc === 'function' ? handleFunc : function () { };
            console.log(url+" handle");
            console.log(handle);
        });
    };

As you can see I am printing the data to the console, and I am getting the right data but the xhr request throws this Error:

"SyntaxError: Unexpected token o at Object.parse (native) at l.json (http://ajax.googleapis.com/ajax/libs/dojo/1.8.1/dojo/dojo.js:228:250) at m (http://ajax.googleapis.com/ajax/libs/dojo/1.8.1/dojo/dojo.js:227:277) at j [as handleResponse] (http://ajax.googleapis.com/ajax/libs/dojo/1.8.1/dojo/dojo.js:151:351) at XMLHttpRequest.e (http://ajax.googleapis.com/ajax/libs/dojo/1.8.1/dojo/dojo.js:154:393)"

While the following old syntax works perfectly:

    this.get = function (url, loadFunc, errorFunc, handleFunc) {
      dojo.xhrGet({
            url: url,
            handleAs: 'json',
            load: typeof loadFunc === 'function' ? loadFunc : function () { },
            error: typeof errorFunc === 'function' ? errorFunc : function () { },
            handle: typeof handleFunc === 'function' ? handleFunc : function () { }
        });
    };

EDIT:

This is my JSON data:

{ "assistants" : [ { "assistants" : [ "M 11",
        "M 1"
      ],
    "name" : "M X1"
  },
  { "assistants" : [ "M 2",
        "M 2XX1",
        "M 3"
      ],
    "name" : "M 1"
  },
  { "assistants" : [ "M 2" ],
    "name" : "M 2"
  },
  { "assistants" : [  ],
    "name" : "M 3"
  }
],
"chiefs" : [ { "chief" : "M X1",
    "name" : "M 11"
  },
  { "chief" : "M 11",
    "name" : "M 1"
  },
  { "chief" : "M X1",
    "name" : "M 2"
  },
  { "chief" : "M 744X1",
    "name" : "M 3"
  }
],
"departments" : [ { "assistants" : [ "M 11",
        "M 3",
        "M 21"
      ],
    "chief" : "M X1",
    "email" : "dg@somedomain.com",
    "interim" : [ "M X542",
        "M 4"
      ],
    "members" : [ "M 2",
        "M 3",
        "M 4",
        "M 5",
        "M X24544"
      ],
    "name" : "Dep1",
    "notify" : [ "Dep2",
        "M X2",
        "M 21"
      ],
    "resp" : "M 21",
    "validators" : [ "Dep2",
        "M 2",
        "M 558"
      ]
  },
  { "chief" : "M 1",
    "email" : "admin@somedomain.com",
    "members" : [ "M 11",
        "M 12"
      ],
    "name" : "Dep3",
    "parent" : "Dep1"
  },
  { "chief" : "M 11",
    "email" : "commercial@somedomain.com",
    "members" : [ "M 21",
        "M 22"
      ],
    "name" : "Dep4",
    "parent" : "Dep1"
  }
],
 "orgaTestModel" : { "corporation" : "Corporation Sample",
  "name" : "Orga Sample 7855"
},
"root" : "Dep1"
}

Note: I am using dojo 1.8.1 version but I tested it with dojo 1.9.2 too, but it still doesn't work.

I can't figure out what's the problem. Is there something wrong with my code or it's another problem ?

Any help would be appreciated.


Solution

  • You haven't provided an example of what your original JSON response looks like, but I am guessing it is not valid JSON.

    dojo.xhrGet actually uses eval when handleAs is set to "json", which will by definition be more permissive than a strict JSON parser. dojo/request, on the other hand, uses JSON.parse if available, which expects JSON to be well formed (e.g. all keys are quoted strings, all strings use double quotes).

    Try pasting one of your JSON responses into http://jsonlint.org/ - if it doesn't validate there, then it won't validate with dojo/request.

    (The reason dojo.xhrGet uses eval, even though it's potentially unsafe, is that it was written prior to widespread JSON.parse support, and changing it would have broken backwards compatibility - in other words, even without switching APIs, developers would run into the problem you're running into right now.)

    Edit: The JSON provided in the question now is valid, and works with both the old and new APIs.