JQuery getJSON - ajax parseerror

Я попытался разобрать следующий json-ответ как с JQuery getJSON, так и с ajax:

[{"iId":"1","heading":"Management Services","body":"<h1>Program Overview</h1><h1>January 29, 2009</h1>"}]

Я также попытался убежать от символов "/" следующим образом:

[{"iId":"1","heading":"Management Services","body":"<h1>Program Overview <\/h1><h1>January 29, 2009<\/h1>"}]

Когда я использую getJSON, его доза не выполняет обратный вызов. Итак, я попробовал JQuery ajax следующим образом:

$.ajax({
    url: jURL,
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    beforeSend: function(x) {
        if(x && x.overrideMimeType) {
            x.overrideMimeType("application/j-son;charset=UTF-8");
        }
    },
    success: function(data){
        wId = data.iId;
        $("#txtHeading").val(data.heading);
        $("#txtBody").val(data.body);
        $("#add").slideUp("slow");
        $("#edit").slideDown("slow");
    },//success
    error: function (XMLHttpRequest, textStatus, errorThrown) {
        alert("XMLHttpRequest="+XMLHttpRequest.responseText+"\ntextStatus="+textStatus+"\nerrorThrown="+errorThrown);
    }
});

Ajax выводит сообщение об ошибке и предупреждает следующее:

XMLHttpRequest=[{"iId":"1","heading":"Management Services","body":"<h1>Program Overview </h1><h1>January 29, 2009</h1>"}]

textStatus=parseerror

errorThrown=undefined

Затем я попробовал простой вызов JQuery get, чтобы вернуть JSON, используя следующий код:

$.get(jURL,function(data){
    var json = eval("("+data+");");
    wId = json.iId;
    $("#txtHeading").val(json.heading);
    $("#txtBody").val(json.body);
    $("#add").slideUp("slow");
    $("#edit").slideDown("slow");
})

.get возвращает JSON, но eval создает ошибки независимо от того, как я изменил JSON (заголовок типа контента, другие варианты формата и т.д.).

То, что я придумал, заключается в том, что, похоже, проблема с возвратом HTML в JSON и его анализом. Однако я надеюсь, что, возможно, я пропустил что-то, что позволило бы мне получить эти данные через JSON. У кого-нибудь есть идеи?

Ответ 1

Строка JSON у вас есть массив с 1 объектом внутри него, поэтому для доступа к объекту, к которому вы должны сначала обратиться к массиву. С json.php, который выглядит так:

[
    {
        "iId": "1",
        "heading": "Management Services",
        "body": "<h1>Program Overview</h1><h1>January 29, 2009</h1>"
    }
]

Я просто попробовал это

$.getJSON("json.php", function(json) {
    alert(json[0].body); // <h1>Program Overview</h1><h1>January 29, 2009</h1>
    alert(json[0].heading); // "Management Services"
    alert(json[0].iId); // "1"
});

Я также пробовал это:

$.get("json.php", function(data){
    json = eval(data);
    alert(json[0].body); // <h1>Program Overview</h1><h1>January 29, 2009</h1>
    alert(json[0].heading); // "Management Services"
    alert(json[0].iId); // "1" 
});

И они оба отлично справились со мной.

Ответ 2

Если у кого-то все еще есть проблемы с этим, потому что ваш ответ должен быть строкой JSON и типом контента "application/json".

Пример для HTTP в asp.net(С#):

public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "application/json";
        context.Response.Write("{ status: 'success' }");
    }

HTH,

Матти

Ответ 3

Пробовал ли вы XML-кодирование HTML (т.е. & lt; H1 & gt;)?

Ответ 4

Вы можете вернуть его в виде текста, а затем проанализировать его с помощью json.org parser
Чтобы увидеть, работает ли это по-другому

Ответ 5

Обратите внимание, что в вопросе есть синтаксическая ошибка. Строка с

x.overrideMimeType("application/j-son;charset=UTF-8");

должен читать

x.overrideMimeType("application/json; charset=UTF-8");

Это также имеет большое значение.

Ответ 6

Удалите [], спереди и последним в JsonData, и он работает.

Ответ 8

Это рабочий пример и протестирован!

<script type="text/javascript">

function fetchData() {
var dataurl = "pie.json";
$.ajax({
    url: dataurl,
    cache: false,
    method: 'GET',
    dataType: 'json',
    success:  function(series) {
        var data = [];
        //alert(series.length);
        for (var i=0; i<series.length;i++){
            data[i]=series[i];
        }

        $.plot(
                $("#placeholder"), 
                data, 
                {
                     series: {
                       pie: {
                         show: true,
                         label: {
                           show: true
                         }
                     }
                    },
                    legend: {
                      show: true
                    }
                  }
       );
     }
});

   //setTimeout(fetchData, 1000);
}
</script>

И источником json является следующее (pie.json):

[{ "label": "Series1",  "data": 10},
{ "label": "Series2",  "data": 30},
{ "label": "Series3",  "data": 90},
{ "label": "Series4",  "data": 70},
{ "label": "Series5",  "data": 80},
{ "label": "Series6",  "data": 110}]

Ответ 9

Во-первых, попытайтесь определить, есть ли проблема с общей кодировкой/декодированием JSON. попробуйте более простые объекты, с числами и обычными строками, затем с цитированным HTML.

После того, как вы заработаете JSON, вам действительно стоит подумать об удалении HTML-кода. Намного лучше перемещать только данные и оставлять детали презентации для шаблонов. При использовании AJAX это означает скрытый шаблон в HTML и использование jQuery для его репликации и заполнения данными. проверьте любой плагин jQuery . Из них jTemplates является общим фаворитом.

Ответ 10

Я думаю, что вы задаете неправильный вопрос. Использование $.getJSON() намного проще, и если у вас возникнет проблема с ним, лучше спросить $.getJSON(), чем для $.ajax(). Вы также можете найти полезный взгляд на исходный код функции getJSON, потому что я вижу, у вас много бесполезных вещей там с mimeTypes. Это не так.

Ответ 11

Значение, которое вы пытаетесь проанализировать, заключено в скобки [], что означает, что это массив. Вы пытаетесь определить массив. Попробуйте оценить первый элемент массива, и он должен работать...

var json = eval("("+data[0]+");");

Кроме того, я бы рекомендовал использовать JSON.parse() при условии здесь вместо прямого вызова eval().

Ответ 12

Я получил аналогичную ошибку. Понадобился немного времени, чтобы узнать - мало ли я знал, что PHP не поддерживает (изначально) JSON с PHP5.2. Критическое напоминание...

Ответ 13

Вчера в $. Ajax до сих пор не ошибается, сегодня процитирована ошибка, некоторые говорят, что проблема с jquery-версией parsererror, я использую jquery-1.3.2.min.js, вчера. Это издание также сделано, сегодня вымыто. Источники данных: без изменений. Не знаете, что такое причина?

Ответ 14

Возможно, потому, что ваш выходной буфер не пуст, поэтому AJAX получает байты, которые не принадлежат JSON.

Попробуйте очистить буфер с помощью ob_clean() на стороне сервера непосредственно перед выходом json с помощью echo или die(). И вам не нужно указывать contentType, я думаю, для вас значение по умолчанию будет работать правильно.

У меня была такая же проблема, и она ее разрешила.

Надеюсь помочь вам.

Ответ 15

в моем случае ошибка была вызвана тегом html в json.

INCORRECT (parsererror)

{"msg": "Gracias,< br >Nos pondremos en contacto."}

ПРАВИЛЬНОЕ

{"msg": "Gracias, nos pondremos en contacto."}

BROWSER: IE7/IE8

Ответ 16

попробуйте это

$.ajax({
    url: url,
    data:datas,
    success:function(datas, textStatus, jqXHR){
    var returnedData = jQuery.parseJSON(datas.substr(datas.indexOf('{')));
})};

в моем случае сервер отвечает неявным символом до '{'

Ответ 17

Не используйте поле массива и убедитесь, что вы правильно отформатировали данные:

{"account":{"iId":"1","heading":"Management Services","body":"<h1>Program Overview</h1><h1>January 29, 2009</h1>"}}