Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.08.2019, 14:45
Аспирант
Отправить личное сообщение для oleg901 Посмотреть профиль Найти все сообщения от oleg901
 
Регистрация: 12.08.2018
Сообщений: 54

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

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". Каким образом исправить синтаксическую ошибку? спасибо
Ответить с цитированием
  #2 (permalink)  
Старый 01.08.2019, 14:51
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Если до или после вывода в браузер json файла есть вывод еще чего либо, то на клиенте не будет валидного json.
Ответить с цитированием
  #3 (permalink)  
Старый 01.08.2019, 15:51
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,225

Сообщение от oleg901
Каким образом исправить синтаксическую ошибку?
Так ты посмотри, что реально тебе приходит в колбек-функцию...
Ответить с цитированием
  #4 (permalink)  
Старый 01.08.2019, 16:10
Аспирант
Отправить личное сообщение для oleg901 Посмотреть профиль Найти все сообщения от oleg901
 
Регистрация: 12.08.2018
Сообщений: 54

Сообщение от ksa Посмотреть сообщение
Так ты посмотри, что реально тебе приходит в колбек-функцию...
Приходит вот-такая строка: Мне ее через регулярное выражение отформатировать, или что ?
"{\"dollar\":27}"
Ответить с цитированием
  #5 (permalink)  
Старый 01.08.2019, 16:15
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

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


Как видите ошибки нет, ибо это строка валидный json. Но можно не видеть того, что мешает, например файл сохранен в UTF (в какой кодировке в общем то и будет корректно работать json) и с BOM, который не видно, но который будет причиной ошибки.
Ответить с цитированием
  #6 (permalink)  
Старый 01.08.2019, 16:37
Аспирант
Отправить личное сообщение для oleg901 Посмотреть профиль Найти все сообщения от oleg901
 
Регистрация: 12.08.2018
Сообщений: 54

Сообщение от laimas Посмотреть сообщение
alert(JSON.parse("{\"dollar\":27}"))


Как видите ошибки нет, ибо это строка валидный json. Но можно не видеть того, что мешает, например файл сохранен в UTF (в какой кодировке в общем то и будет корректно работать json) и с BOM, который не видно, но который будет причиной ошибки.
Да, вы правы если просто с объекта скопировать строку и вставить в параметр функции ошибки не будет! Кодировка у меня utf-8 как и кодировка html файла. в редакторе выставлен utf-8 без bom. Где еще можно поменять кодировку? Вроде везде все ровно. А ошибка все ровно есть
Ответить с цитированием
  #7 (permalink)  
Старый 01.08.2019, 16:59
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

А если строчкой ранее, перед 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;
         
})

Последний раз редактировалось Malleys, 01.08.2019 в 17:24.
Ответить с цитированием
  #8 (permalink)  
Старый 01.08.2019, 17:08
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

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

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

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


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

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

Последний раз редактировалось laimas, 01.08.2019 в 17:14.
Ответить с цитированием
  #9 (permalink)  
Старый 01.08.2019, 18:39
Аспирант
Отправить личное сообщение для oleg901 Посмотреть профиль Найти все сообщения от oleg901
 
Регистрация: 12.08.2018
Сообщений: 54

Сообщение от Malleys Посмотреть сообщение
А если строчкой ранее, перед JSON.parse написать
alert(server.response.charCodeAt(0));
то какое число выводит? (Должно 123?)
Да, выводит 123 а перед этим NaN. И данная проверка действительно сработала ошибки не выводит.
Ответить с цитированием
  #10 (permalink)  
Старый 01.08.2019, 18:42
Аспирант
Отправить личное сообщение для oleg901 Посмотреть профиль Найти все сообщения от oleg901
 
Регистрация: 12.08.2018
Сообщений: 54

Сообщение от laimas Посмотреть сообщение
Если файл содержит только латиницу (английский набор), то все будет нормально даже и не в 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;
ошибки нет!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу понять, помогите, indexOf SergoMorello Общие вопросы Javascript 17 02.11.2017 19:50
не могу понять как работает him Общие вопросы Javascript 1 05.01.2014 00:20
Не могу понять какая кодировка Andrey Sipin Events/DOM/Window 1 05.10.2009 18:25
Как выдавать ошибку при сбросе загрузки страницы? AvaGet Общие вопросы Javascript 2 11.12.2008 19:04
Не могу понять как работает jQuery kostiaGt jQuery 2 20.07.2008 08:42