JQuery getJSON - ajax parseerror - PullRequest
15 голосов
/ 10 марта 2009

Я попытался проанализировать следующий ответ 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

Затем я попробовал простой вызов get из JQuery, чтобы вернуть 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. У кого-нибудь есть идеи?

Ответы [ 17 ]

7 голосов
/ 10 марта 2009

Строка 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" 
});

И они оба работали нормально для меня.

3 голосов
/ 17 марта 2010

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

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

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

НТН,

Матти

1 голос
/ 10 марта 2009

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

1 голос
/ 10 марта 2009

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

1 голос
/ 23 июля 2012

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

<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}]
1 голос
/ 29 января 2011

Отключение Firebug Lite решило эту проблему для меня.

Ошибка с комбинацией: jQuery 1.4, ajax / json, Firebug Lite и IE 8

1 голос
/ 01 февраля 2010

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

1 голос
/ 24 ноября 2009

Прошу заметить, что в вопросе есть синтаксическая ошибка. Линия с

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

следует читать

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

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

0 голосов
/ 30 ноября 2013

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

{"account":{"iId":"1","heading":"Management Services","body":"<h1>Program Overview</h1><h1>January 29, 2009</h1>"}}
0 голосов
/ 06 апреля 2012

также попробуйте это

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

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

...