I get an error when sending JSON data to JavaScript from the models. It looks like encoding is causing the error, but all the examples I have found work for other people. How can I properly send model data from my view to JavaScript?
view code:
def home(request):
import json
info_obj = Info.objects.all()
json_data = serializers.serialize("json", info_obj)
return render_to_response("pique/home.html", {'json_data':json_data}, context_instance=RequestContext(request))
JavaScript code:
var data = jQuery.parseJSON('{{json_data}}');
console.log(data);
The error Uncaught SyntaxError: Unexpected token &:
var data = jQuery.parseJSON('[{"pk": 1, "model": "pique.eat" ...
You must use " instead of " in the string.
The string was automatically escaped by render_to_response.
To avoid this you must mark json_data safe. Use mark_safe for it.
from django.utils.safestring import mark_safe
return render_to_response(
"pique/home.html",
{
'json_data':mark_safe(json_data)
},
context_instance=RequestContext(request))
Your data is html encoded. It should come from the server with quotes and all. Is render_to_response doing some sort of encoding? What does json_data look like before that function?
Related
I have the following valid json (partially shown), which I have received as a response to an HTTP request (I don't control the server):
"TotalResults":2,"SearchTerm":"XX","SearchTermClean":"XX","SearchTermExact":"\"XX\"","SearchTermNonExact":"XX","Page":1,"PageSize":100,"TotalPages":1,"TotalTime":0.072,"Filter":"","Sort":"","SortClean":"","IsDesc":false,"PreviousPage":1,"NextPage":1}'
I'm trying to parse this JSON using:
var json_obj= JSON.parse(helpers.testJSON());
where testJSON returns an entire string of json.
I'm getting:
Uncaught SyntaxError: Unexpected token X in JSON at position 1685
which translates to:
":"\"XX\""
How can I fix this error? I assume I would need to preprocess the JSON before using JSON.parse
There is an error in your example. You are using double quotes inside the string. To fix this, you need to escape them with \
So your JSON will look like this:
{
"Results":2,
"SearchTerm":"XX",
"SearchTermClean":"XX",
"SearchTermExact":"\"XX\"",
"SearchTermNonExact":"XX",
"Page":1,
"PageSize":100,
"TotalPages":1,
"TotalTime":0.072,
"Filter":"",
"Sort":"",
"SortClean":"",
"IsDesc":false,
"PreviousPage":1,
"NextPage":1
}
For easy detection of errors in JSON syntax, beautify and other useful actions, you can use this tool
I'm attempting to get a JSON file into a script. I can't seem to be able to get it there by serving it from the filesystem so I made a view that returns the JSON data to the page like so:
def graph(request, d): #d.data is the file in the database
data = json.load(d.data)
return render(request, 'temp/template.html', {'json': data})
In my JS:
var j = {{ json|safe }};
When I look at the source for the JS it shows the data in this format:
{u'people': [{u'name': u'steve'}, {u'name': u'dave'}]}
Which I read shouldn't be a problem. I don't have any variables called 'id' and yet I get the error in the title pointing to the provided line of JS.
Why could this be? Also how do I then use the objects from the JSON in my script?
Solved by using simplejson:
import simplejson as json
And everything else as above. This is because the built in json.dumps returns an array of unicode like:
{u'people': [{u'name': u'steve'}, {u'name': u'dave'}]}
When using simplejson that shouldn't be a problem.
Here is my json http://jsbin.com/wagomomuda/1/edit
when I try to run, I get an error as unexpected token :, i tried validating my json, in many sites, it says its valid.Can anyone please help me out with this, as I am new to json.
Check the bellow json
var jsonvarable='{"content":{"comments":[{"userName":"ElizabethEstes","currentDate":"-09/10/2014","currentTime":",08:42AM","image":"ellizabeth_estes.png","data":"Cumsociisnatoquepenatibusetmagnisdisparturientmontes,nasceturridiculusmus.Vivamussagittislacusvelauguelaoreetrutrun"},{"userName":"BillBaggins","currentDate":"-09/10/2014","currentTime":",08:42AM","image":"john-smith_img.png","data":"Cumsociisnatoquepenatibusetmagnisdisparturientmontes,nasceturridiculusmus.Vivamussagittislacusvelauguelaoreetrutrun"},{"userName":"SarahSmith","currentDate":"-09/10/2014","currentTime":",08:42AM","image":"sarah.png","data":"Cumsociisnatoquepenatibusetmagnisdisparturientmontes,nasceturridiculusmus.Vivamussagittislacusvelauguelaoreetrutrun"}]}}';
your json is valid,but your script is invalid, code between { } is a code block,so your code looks like
"content":{ ......}
add this is a invalid script
you may change it to
var myJson = {"content":{ ......}};
I have YShout running for some time but after I moved to a new server with nginx and PHP5.5 it doesn't work anymore.
Firebug always returns SyntaxError: syntax error
http://domain.tld/yshout/cp/js/admincp.js
Line 295
(
This are the lines (var json is line 295):
json: function(parse) {
var json = eval('(' + parse + ')');
return json;
},
How can I solve the problem? Thanks!
Your PHP is configured wrong. It sends back the PHP source code, instead of interpreting it. Your ajax-loaded response currently has a value of
<?
class FileStorage {
function FileStorage($path, $shoutLog = false) {
…
}
?>
When that gets fed into your json function, the eval throws an error like Unhandled Error: at index 1: expected expression, got '<'. So:
fix your PHP
use JSON.parse; do not use eval('(' + parse + ')').
I'm trying to learn some html/css/javascript, so I'm writing myself a teaching project.
The idea was to have some vocabulary contained in a json file which would then be loaded into a table. I managed to load the file in and print out one of its values, after which I began writing the code to load the values into the table.
After doing that I started getting an error, so I removed all the code I had written, leaving me with only one line (the same line that had worked before) ... only the error is still there.
The error is as follows:
Uncaught SyntaxError: Unexpected token o
(anonymous function)script.js:10
jQuery.Callbacks.firejquery-1.7.js:1064
jQuery.Callbacks.self.fireWithjquery-1.7.js:1182
donejquery-1.7.js:7454
jQuery.ajaxTransport.send.callback
My javascript code is contained in a separate file and is simply this:
function loadPageIntoDiv(){
document.getElementById("wokabWeeks").style.display = "block";
}
function loadWokab(){
//also tried getJSON which threw the same error
jQuery.get('wokab.json', function(data) {
var glacier = JSON.parse(data);
});
}
And my JSON file just has the following right now:
[
{
"english": "bag",
"kana": "kaban",
"kanji": "K"
},
{
"english": "glasses",
"kana": "megane",
"kanji": "M"
}
]
Now the error is reported in line 11 which is the var glacier = JSON.parse(data); line.
When I remove the json file I get the error: "GET http://.../wokab.json 404 (Not Found)" so I know it's loading it (or at least trying to).
Looks like jQuery takes a guess about the datatype. It does the JSON parsing even though you're not calling getJSON()-- then when you try to call JSON.parse() on an object, you're getting the error.
Further explanation can be found in Aditya Mittal's answer.
The problem is very simple
jQuery.get('wokab.json', function(data) {
var glacier = JSON.parse(data);
});
You're parsing it twice. get uses the dataType='json', so data is already in json format.
Use $.ajax({ dataType: 'json' ... to specifically set the returned data type!
Basically if the response header is text/html you need to parse, and if the response header is application/json it is already parsed for you.
Parsed data from jquery success handler for text/html response:
var parsed = JSON.parse(data);
Parsed data from jquery success handler for application/json response:
var parsed = data;
Another hints for Unexpected token errors.
There are two major differences between javascript objects and json:
json data must be always quoted with double quotes.
keys must be quoted
Correct JSON
{
"english": "bag",
"kana": "kaban",
"kanji": "K"
}
Error JSON 1
{
'english': 'bag',
'kana': 'kaban',
'kanji': 'K'
}
Error JSON 2
{
english: "bag",
kana: "kaban",
kanji: "K"
}
Remark
This is not a direct answer for that question. But it's an answer for Unexpected token errors. So it may be help others who stumple upon that question.
Simply the response is already parsed, you don't need to parse it again. if you parse it again it will give you "unexpected token o" however you have to specify datatype in your request to be of type dataType='json'
I had a similar problem just now and my solution might help. I'm using an iframe to upload and convert an xml file to json and send it back behind the scenes, and Chrome was adding some garbage to the incoming data that only would show up intermittently and cause the "Uncaught SyntaxError: Unexpected token o" error.
I was accessing the iframe data like this:
$('#load-file-iframe').contents().text()
which worked fine on localhost, but when I uploaded it to the server it stopped working only with some files and only when loading the files in a certain order. I don't really know what caused it, but this fixed it. I changed the line above to
$('#load-file-iframe').contents().find('body').text()
once I noticed some garbage in the HTML response.
Long story short check your raw HTML response data and you might turn something up.
SyntaxError: Unexpected token o in JSON
This also happens when you forget to use the await keyword for a method that returns JSON data.
For example:
async function returnJSONData()
{
return "{\"prop\": 2}";
}
var json_str = returnJSONData();
var json_obj = JSON.parse(json_str);
will throw an error because of the missing await. What is actually returned is a Promise [object], not a string.
To fix just add await as you're supposed to:
var json_str = await returnJSONData();
This should be pretty obvious, but the error is called on JSON.parse, so it's easy to miss if there's some distance between your await method call and the JSON.parse call.
Make sure your JSON file does not have any trailing characters before or after. Maybe an unprintable one? You may want to try this way:
[{"english":"bag","kana":"kaban","kanji":"K"},{"english":"glasses","kana":"megane","kanji":"M"}]
const getCircularReplacer = () => {
const seen = new WeakSet();
return (key, value) => {
if (typeof value === "object" && value !== null) {
if (seen.has(value)) {
return;
}
seen.add(value);
}
return value;
};
};
JSON.stringify(tempActivity, getCircularReplacer());
Where tempActivity is fething the data which produces the error "SyntaxError: Unexpected token o in JSON at position 1 - Stack Overflow"