json Uncaught SyntaxError: Неожиданный токен:

67

Попытка сделать вызов и получить очень простую, одну строку, файл JSON.

$(document).ready(function() {

    jQuery.ajax({ 
        type: 'GET',
        url: 'http://wncrunners.com/admin/colors.json' ,
        dataType: 'jsonp', 
        success: function(data) { 
            alert('success');
        }
    });


  });//end document.ready

Здесь запрос RAW:

GET http://wncrunners.com/admin/colors.json?callback=jQuery16406345664265099913_1319854793396&_=1319854793399 HTTP/1.1
Host: wncrunners.com
Connection: keep-alive
Cache-Control: max-age=0
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.106 Safari/535.2
Accept: */*
Referer: http://localhost:8888/jquery/Test.html
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

Здесь ответ RAW:

HTTP/1.1 200 OK
Date: Sat, 29 Oct 2011 02:21:24 GMT
Server: Apache/1.3.33 (Unix) mod_ssl/2.8.22 OpenSSL/0.9.7d SE/0.5.3
Last-Modified: Fri, 28 Oct 2011 17:48:47 GMT
ETag: "166a2402-10-4eaaeaff"
Accept-Ranges: bytes
Content-Length: 16
Content-Type: text/plain
Connection: close

{"red" : "#f00"}

JSON возвращается в ответ (красный: # f00), но отчеты Chrome Uncaught SyntaxError: Неожиданный токен: colors.json: 1

Если я перехожу непосредственно к URL-адресу, JSON возвращается и отображается в браузере.

Если я вставляю содержимое colors.json в JSLINT, json проверяет.

Любые идеи, почему я не могу получить эту ошибку, и я никогда не делаю это для успешного обратного вызова?

EDIT - вызов jQuery.ajax() выше отлично работает на jsfiddle.net и возвращает предупреждение "успех", как и ожидалось.

РЕДАКТИРОВАТЬ 2 - этот URL-адрес работает отлично 'http://api.wunderground.com/api/8ac447ee36aa2505/geolookup/conditions/q/IA/Cedar_Rapids.json' Я заметил, что он вернулся как ТИП: текст /javascript, а Chrome не выбрасывает Неожиданный токен. Я тестировал несколько других URL-адресов, а ТОЛЬКО один, который не выбрасывает Unexptected Token, - это wunderground, которая возвращается как TYPE: text/javascript.

Потоки, возвращаемые как text/plain и application/json, не обрабатываются правильно.

  • 0
    Кстати, я понял, что при нажатии на URL в браузере «#» на самом деле не отображается в json. wncrunners.com/admin/colors.json
  • 0
    Спасибо за вклад. Я удалил #, чтобы проверить теорию Кейта. Удаление не повлияло на ошибку. Я также удалил расширение .json из файла. Та же ошибка
Теги:
syntax-error

4 ответа

132
Лучший ответ

Вы сказали jQuery ожидать ответ JSONP, поэтому jQuery добавила часть callback=jQuery16406345664265099913_1319854793396&_=1319854793399 к URL-адресу ( вы можете увидеть это в своем дампе запроса).

То, что вы возвращаете, это JSON, а не JSONP. Ваш ответ выглядит как

{"red" : "#f00"}

и jQuery ожидает что-то вроде этого:

jQuery16406345664265099913_1319854793396({"red" : "#f00"})

Если вам действительно нужно использовать JSONP, чтобы обойти одну и ту же политику происхождения, сервер, обслуживающий colors.json, должен иметь возможность фактически вернуть ответ JSONP.

Если одна и та же политика происхождения не является проблемой для вашего приложения, вам просто нужно исправить dataType в вашем вызове jQuery.ajax как json вместо jsonp.

  • 3
    Спасибо Джон. Если я возьму тот же код и укажу на api.wunderground.com/api/8ac447ee36aa2505/geolookup/conditions/… ', тогда ответ будет иметь jQueryxxxx (), обернутый вокруг данных json, код работает нормально, и я получаю «Успех» оповещения. Я не могу изменить способ, которым удаленный сервер обслуживает файл JSON. Если я использую dataType: 'json', то я получаю XMLHttpRequest, не могу загрузить isohunt.com/js/json.php?ihq=test . Источник localhost: 8888 не разрешен Access-Control-Allow-Origin.
  • 0
    Хорошо. URL Weather Underground вы дали ли реагировать на JSONP запросы. (Вы увидите это, если добавите ?callback=something к этому URL. Ошибка, которую вы получаете, когда используете dataType: json , из-за той же политики происхождения. Позвольте мне добавить к моему ответу.
Показать ещё 4 комментария
3

Я провел последние несколько дней, пытаясь понять это сам. Использование старого json dataType дает вам проблемы с перекрестным происхождением, а установка dataType в jsonp делает данные "нечитаемыми", как описано выше. Таким образом, есть, по-видимому, два выхода, первый не работал у меня, но кажется потенциальным решением и что я могу делать что-то неправильно. Это объясняется здесь [https://learn.jquery.com/ajax/working-with-jsonp/].

Тот, который работал у меня, был следующим: 1- загрузите плагин перекрестной генерации ajax в [http://www.ajax-cross-origin.com/]. 2- добавьте ссылку script к ней чуть ниже обычной ссылки jQuery. 3- добавьте строку "crossOrigin: true" в вашу функцию ajax.

Хорошо! вот мой рабочий код для этого:

  $.ajax({
      crossOrigin: true,
      url : "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=-33.86,151.195&radius=5000&type=ATM&keyword=ATM&key=MyKey",
      type : "GET",
      success:function(data){
         console.log(data);
      }
    })
  • 0
    спасибо с. Rehan. Этот пост был спасителем!
  • 0
    Это хорошее исправление!
Показать ещё 2 комментария
2

У меня была та же проблема, и решение заключалось в том, чтобы инкапсулировать json внутри этой функции

JSONP (

.... ваш json...

)

  • 5
    Вы инкапсулируете на стороне сервера? Или есть способ сделать это на стороне клиента?
1

Этот шестнадцатеричный текст, возможно, должен быть заключен в кавычки и преобразован в строку. Javascript может не понравиться символ #

  • 0
    Кит, спасибо за ваш ответ. Чтобы проверить, я удалил знак # из файла так, что его содержимое теперь {"red": "f00"}, но та же ошибка сохраняется. Одна вещь, которую я замечаю, состоит в том, что тип содержимого ответа является text / plain, а не application / json.
  • 0
    В качестве другого теста я переименовал файл, чтобы он был просто цветным (без расширения), и я получаю точно такую же ошибку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню