Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Не могу понять как убрать синтаксическую ошибку (https://javascript.ru/forum/dom-window/78143-ne-mogu-ponyat-kak-ubrat-sintaksicheskuyu-oshibku.html)

oleg901 01.08.2019 14:45

Не могу понять как убрать синтаксическую ошибку
 
Добрый день, есть такой код

let dollar = document.querySelector('#DOLLAR'),
		griv   = document.querySelector('#GRIV');


		dollar.addEventListener('input', function(e){
				let server = new XMLHttpRequest();
						server.open("GET", '../js/ajax/current.json');
						server.setRequestHeader('Content-type','application/json; charset=utf-8');
						server.send();
		
			

			server.addEventListener('readystatechange', function(){
				let t =	JSON.parse(server.response);
				let val =	e.target.value;
			  griv.value = +val * t.dollar;
		
			})
			
		
		
		})


Вот в этой строке
let t =	JSON.parse(server.response);
выдает эту самую ошибку.

Вот такой код файле json

{
"usd": 27
}


Ошибка выглядит следующим образом "SyntaxError: JSON.parse: unexpected end of data at line 1 column 1 of the JSON data" Сам скрипт работает но вылетает в консоль эта ошибка. Использую локальный сервер "open server". Каким образом исправить синтаксическую ошибку? спасибо

laimas 01.08.2019 14:51

Если до или после вывода в браузер json файла есть вывод еще чего либо, то на клиенте не будет валидного json.

ksa 01.08.2019 15:51

Цитата:

Сообщение от oleg901
Каким образом исправить синтаксическую ошибку?

Так ты посмотри, что реально тебе приходит в колбек-функцию...

oleg901 01.08.2019 16:10

Цитата:

Сообщение от ksa (Сообщение 511064)
Так ты посмотри, что реально тебе приходит в колбек-функцию...

Приходит вот-такая строка: Мне ее через регулярное выражение отформатировать, или что ?
"{\"dollar\":27}"

laimas 01.08.2019 16:15

alert(JSON.parse("{\"dollar\":27}"))


Как видите ошибки нет, ибо это строка валидный json. Но можно не видеть того, что мешает, например файл сохранен в UTF (в какой кодировке в общем то и будет корректно работать json) и с BOM, который не видно, но который будет причиной ошибки.

oleg901 01.08.2019 16:37

Цитата:

Сообщение от laimas (Сообщение 511068)
alert(JSON.parse("{\"dollar\":27}"))


Как видите ошибки нет, ибо это строка валидный json. Но можно не видеть того, что мешает, например файл сохранен в UTF (в какой кодировке в общем то и будет корректно работать json) и с BOM, который не видно, но который будет причиной ошибки.

Да, вы правы если просто с объекта скопировать строку и вставить в параметр функции ошибки не будет! Кодировка у меня utf-8 как и кодировка html файла. в редакторе выставлен utf-8 без bom. Где еще можно поменять кодировку? Вроде везде все ровно. А ошибка все ровно есть

Malleys 01.08.2019 16:59

А если строчкой ранее, перед JSON.parse написать
alert(server.response.charCodeAt(0));
то какое число выводит? (Должно 123?)

Цитата:

Сообщение от oleg901
unexpected end of data at line 1 column 1

Я так понимаю, у вас будет NaN, поскольку у вас строка сразу завершается, т. е. у вас там пустая строка!
И это произошло, поскольку событие readystatechange происходит несколько раз, где server.readyState имеет сл. значения...
0: запрос ещё не отправлен
1: соединение с сервером установлено
2: запрос принят
3: обработка запроса
4: запрос завершен и ответ готов

Вы можете получить текст только на этапе №4...
server.addEventListener('readystatechange', function() {
    if(server.readyState != 4 || server.status != 200) return;
    let t = JSON.parse(server.responseText);
    let val =   e.target.value;
    griv.value = +val * t.dollar;
         
})

laimas 01.08.2019 17:08

Цитата:

Сообщение от oleg901
Где еще можно поменять кодировку?

Если файл содержит только латиницу (английский набор), то все будет нормально даже и не в UTF.

Значит нет проблем на сервере, а проблема в обработчике, попробуйте вот так

server.onload = () => {
    let t = JSON.parse(server.response);
    ...
}


вместо server.addEventListener('readystatechange', function(){ ....

PS. Кстати, server.setRequestHeader('Content-type','application/json; charset=utf-8'); - без толку в данном случае.

oleg901 01.08.2019 18:39

Цитата:

Сообщение от Malleys (Сообщение 511071)
А если строчкой ранее, перед JSON.parse написать
alert(server.response.charCodeAt(0));
то какое число выводит? (Должно 123?)

Да, выводит 123 а перед этим NaN. И данная проверка действительно сработала ошибки не выводит.

oleg901 01.08.2019 18:42

Цитата:

Сообщение от laimas (Сообщение 511072)
Если файл содержит только латиницу (английский набор), то все будет нормально даже и не в UTF.

Значит нет проблем на сервере, а проблема в обработчике, попробуйте вот так

server.onload = () => {
    let t = JSON.parse(server.response);
    ...
}


вместо server.addEventListener('readystatechange', function(){ ....

PS. Кстати, server.setRequestHeader('Content-type','application/json; charset=utf-8'); - без толку в данном случае.

Да, и вы тоже правы проблема была в обработчике "readystatechange" данная проверка
if(server.readyState != 4 || server.status != 200) return;
ошибки нет!


Часовой пояс GMT +3, время: 05:11.