Apologies if this is a simple fix. I'm still in the process of learning Javascript.
I'm trying to use UserALE to extract attributes from an SVG object that gets clicked on in Apache Superset. At present, my solution is to serialize the event target object to a string, then parse it to XML and use .getAttribute() to isolate the specific attribute I want, which I then send to a custom userALE log.
The problem is, xml.getAttribute("data_I_want") doesn't seem to be functioning properly. Whenever I call it, it returns the error Uncaught TypeError: xml.getAttribute is not a function. So far as I understand, this should be working fine with my newly-parsed XML, especially because I can print and see the whole XML document just fine. I can extract the relevant data by making a substring out of the serialized string, but that process is a bit involved, and I'd like to make it a bit more streamlined.
Is there some critical component of the XML doc that I'm missing? Am I missing a library?
How do I get getAttribute to function properly?
Here's my code:
const valtofind = 'data-info'
function parseXml(xmlStr) {
return new window.DOMParser().parseFromString(xmlStr, "text/xml");
}
document.addEventListener('click', function(e) {
var serializer = new XMLSerializer();
var xmlString = serializer.serializeToString(e.target);
var xml = parseXml(xmlString);
console.log(xml);
console.log('---------------------------------------------------------------------------------------------------------------')
console.log(xml.getAttribute(valtofind));
console.log('---------------------------------------------------------------------------------------------------------------')
if (xml.getAttribute(valtofind)) != '' ) {
userale.packageCustomLog({
customLabel: "The selected contry's name and metadata",
logtype: 'countryInfo',
data_info: xml.getAttribute('data-info')
},
);
}
});
This prints the xml document to the console, and then gives the error Uncaught TypeError: xml.getAttribute is not a function.
I am trying to parse an XML file using Javascript, but I keep getting the same error:
SyntaxError: malformed hexadecimal character escape sequence
$.get('C:\Users\xxxxxx\Desktop\xmloutput.xml', function(xml) {
and it points to the single-quotes right before the C. I looked up the error, but there isn't much information about how to get around it. Or is my syntax incorrect? Here is my code:
$(document).ready(function(){
var data = new Array();
// Load the data from the XML file
$.get('C:\Users\plk7504\Desktop\xmloutput.xml', function(xml) {
// Split the lines
var $xml = $(xml);
// push series
$xml.find('row').each(function(i, row) {
var seriesOptions = {
Category: $(series).find('Category').text(),
Actual: $(series).find('Actual').text(),
Plan: $(series).find('Plan').text(),
Variance: $(series).find('Variance').text(),
};
// add it to the options
data.push(seriesOptions);
});
});
$("#month_an_plan1").replaceWith(data[0]);
});
update the path to be:
C:\\Users\\plk7504\\Desktop\\xmloutput.xml
Also see: How to open a local disk file with Javascript?
Explanation:
C:\\Users\\plk7504\\Desktop\\xmloutput.xml would be translated to C:\Users\plk7504\Desktop\xmloutput.xml right? so the problem you were seeing is because you were essentially trying to "escape" other characters such as '\U'
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"
I am trying to read the finance info from the google page into a json object.
Code is below:
try {
$.getJSON("http://finance.google.com/finance/info?client=ig&q=NSE:GOLDBEES&jsoncallback=?",function(data){
alert(data);//var jsondata = data;
//jsonobj = $.parseJSON(jsondata);
//alert(jsonobj[0].id);
});
} catch(e) {
alert(e.toString());
}
However I keep getting this error all the time on firebug
invalid label
"id": "4052464"
Is there any way this info can be read. My ultimate goal is to create a windows 7 gadget that doesnt use server side scripting and can be used from any Windows 7 system.
Appreciate all the help.
John
Response isn't valid JSON (response is prefixed with //), so jQuery won't be able to parse it correctly anyway.
To solve change &jsoncallback=? to &callback=?
so
$.getJSON("http://finance.google.com/finance/info?client=ig&q=NSE:GOLDBEES&callback=?", function(data) {
alert(data)
});
The response from Google has two leading /'s, making the response invalid JSON... for some reason.
Because of this, you cannot use jQuery.getJSON, as it expects a JSON response. Instead, you should use jQuery.get, and parse the JSON yourself after removing the two leading slashes.
jQuery.get('http://finance.google.com/finance/info?client=ig&q=NSE:GOLDBEES&jsoncallback=?', function (string) {
var validJson = string.slice(2);
var obj = jQuery.parseJSON(validJSON);
// use obj
});
Two additional points:
No JSONP is being used, so you don't need the jsoncallback=? in your request URL
The Windows Sidebar has been retired, so you cannot publish you finished gadget to the official gallery.