Статус 200 OK, тот же домен, действительные данные JSON и отсутствие ответа (Ajax)

Вот мой вызов ajax:

$.ajax({ url : hostGlobal + "site/modulos/prefeitura/acoes-jquery.php", type: "POST", dataType : "JSON", data: { acao: "filtrarCidades", estado_id: $(".estados:chosen").val() }, success: function(json) { console.log("worked"); $(".cidades").html(''); var options = "<option value=\"\"></option>"; $.each(json, function(key, value) { options += '<option value="' + key + '">' + value + '</option>'; }); $(".cidades").html(options); if (!filterThroughCEP) { $(".cidades").trigger("chosen:updated"); } }, error: function(e) { console.log(e.responseText); } }); 

Вот действие php:

 if ($acao == 'filtrarCidades') { $estado_id = $_POST['estado_id']; $cidade->where = "estado_id = '".$_POST['estado_id']."'"; $cidade->LoadFromDB(); for ($c=0; $c<count($cidade->itens); $c++) { $cidades[$cidade->itens[$c]->id] = $cidade->itens[$c]->nome; } echo json_encode($cidades); die(); } 

json_encode($cidades) – это действительные данные json (UTF8), вот пример использования debug:

 {"1778":"Bras\u00edlia"} 

Это {"1778":"Bras\u00edlia"} идет как e.responseText (Error), даже с статусом «ОК», а URL-адрес находится в одном домене (нет необходимости в JSONP). Я понятия не имею, почему я не могу достичь success .

EDIT: Я установил contentType:

 contentType: "application/json", 

И звонок по-прежнему не может «достичь» успеха. Вот третий аргумент ошибки:

 SyntaxError: Unexpected token at parse (native) at ajaxConvert (http://localhost/sisconbr-sistema-novo/site/visual/js/jquery.js:7608:19) at done (http://localhost/sisconbr-sistema-novo/site/visual/js/jquery.js:7363:15) at XMLHttpRequest.<anonymous> (http://localhost/sisconbr-sistema-novo/site/visual/js/jquery.js:7835:9) 

Это действительно связано с символами Unicode внутри строк, которые поступают из базы данных.

EDIT2 : Я снова написал все это, и теперь это яснее:

 function getCitiesByState() { $.ajax({ url : hostGlobal + "site/estrutura/ajax.php", type: "POST", dataType : "text", data: { action: "getCitiesByState", state_id: $(".estados option:selected").val() }, success: function(json, textStatus, jqXHR) { console.log($.parseJSON(json)); }, error: function(jqXHR, textStatus, errorThrown) { console.log(errorThrown); } }); } 

PHP:

 if ($_POST["action"] == "getCitiesByState") { $cities = getResults("SELECT * FROM tbl_cidades WHERE estado_id = ".$_POST["state_id"]); echo json_encode($cities, JSON_UNESCAPED_UNICODE); die(); } 

Вывод:

 [{"id":"1778","estado_id":"7","nome":"Brasília","cep":"","loc_no_abrev":"Brasília"}] 

Ошибка:

 Uncaught SyntaxError: Unexpected token 

Я думаю, что проблема заключается в объектном свойстве {"1778": "Bras \ u00edlia"} означает объект с недопустимым именем свойства, поэтому json-декодирование завершается неудачно; чтобы доказать, что это правильно, попробуйте либо

  1. используйте обычный текст как dataType и запишите его, он должен работать [но, конечно, вы не сможете преобразовать его в json]
  2. changeLoadFromDB, так что имя свойства действительно [начинается с буквы, _ или $], у вас будет действительный ответ JSON, но вам нужно будет изменить способ его использования

он 1778 является идентификатором, правильная структура должна быть {id: «1778», свойство: «Bras \ u00edlia»} и работать безупречно, дайте ему попробовать и сообщите нам об этом

EDIT: как предложил jcaron , я должен исправить этот ответ: «1778» действительно является допустимым именем свойства, но недействительным идентификатором, если используется точечная нотация. Так как я не знаю, как это работает с jQuery, я бы предложил протестировать, как указано выше, и посмотреть, дает ли один из тестов результаты.