парсинг ответа из XMLHttpRequest - PullRequest
1 голос
/ 19 марта 2011

Я пытаюсь разобрать ответ из XMLHttpRequest.Ответ в формате json:

http://flickr.com/services/rest/?method=flickr.photos.search&api_key=75564008a468bf8a284dc94bbd176dd8&tags=paris&format=json

, чтобы убедиться, что он действительно получился таким, как я его протестировал:

document.getElementById('info').innerHTML = this.responseText

, который возвращает мне страницу с длинной строкой данныхнаписано в формате JSON.Может ли кто-нибудь помочь мне выяснить следующие шаги для извлечения данных из ответа, то есть списка всех названий

Я провел некоторое исследование и натолкнулся на следующее:

response = this.responseText ;
var doc = new DOMParser().parseFromString(response, "text/xml");

Что мне делать?нужно делать дальше?(Примечание: я хочу сделать это вручную, т.е. без помощи jQuery или аналогичных инструментов.)

[РЕДАКТИРОВАТЬ]

на основе приведенных ниже предложений и Страница Flickr по этому вопросу , я пробовал следующее:

request.onreadystatechange = function()
{
 ...
            if (this.responseXML != null)
            {
                jsonFlickrApi(this.responseText) ;

                function jsonFlickrApi(rsp){

                    for (var i=0; i<rsp.photos.photo.length; i++){

                        var blog = rsp.photos.photo[i];

                        var div = document.createElement('div');
                        var txt = document.createTextNode(photo.owner);

                        div.appendChild(txt);
                        //document.body.appendChild(div);
                        document.getElementById('info').innerHTML.appendChild(div);
                    }
...
}

пока ничего не видно.

[EDIT2]

дальнейшее устранение неисправностей показывает:

rsp = this.responseText ;
document.getElementById('info').innerHTML = rsp.stat ;

отпечатки undefined

Ответы [ 3 ]

2 голосов
/ 19 марта 2011

URL-адрес, который вы дали, возвращает что-то вроде этого:

jsonFlickrApi({"photos":{"page":1, "p ... , "stat":"ok"})

Итак, в основном, это похоже на код Javascript, который:

  • Вызывает функцию jsonFlickrApi,
  • Передавая ему большой JSON-объект в качестве параметра.


Прежде всего, здесь вы работаете с JSON, поэтому вам не следует использовать какие-либо связанные с DOMвещи: цель функций DOM - помочь манипулировать XML.


Вместо этого вам следует:

  • Написать функцию jsonFlickrApi,
  • Убедитесь, чтоон вызывается, когда вы получаете данные от Flickr

Об этом вы должны найти немного больше информации и пример, здесь: http://www.flickr.com/services/api/response.json.html


Еще, добавивпараметр &nojsoncallback=1 в конце URL вашего запроса, в результате вы получите чистый JSON (а не вызов функции) .

Это позволит вамиспользовать стандартные функции JSON-манипуляции для работы с этими данными, не прибегая к реализации какой-либо конкретной функции.

Между этими решениямиВ любом случае, вам решать, какой из них вы предпочитаете: -)

1 голос
/ 19 марта 2011

Другая альтернатива - вообще не использовать JSON, а вместо этого использовать XML. Оставьте часть URL format=json, и вы получите данные в виде XML. Этот XML может быть проанализирован, например, с помощью метода DOMParser(), который вы пробовали, или с помощью this.responseXML. Однако «логистика» использования XML по сравнению с JSON немного сложнее, поскольку вы просматриваете дерево DOM, а не объект JS.

Обновление:

Итак, вот одна из темных деталей AJAX. В зависимости от браузера, вы не можете просто делать запросы XML между доменами. Следующий код будет работать (возвращать что-то полезное) в Safari, но не в Firefox или Chrome. (Там он будет возвращать пустые или пустые строки.) Однако JSON-запросы работают нормально во всех браузерах.

<script>
function createXHR(){
  if (window.XMLHttpRequest){
    // code for IE7+, Firefox, Chrome, Opera, Safari
    return new XMLHttpRequest();
  }
  if (window.ActiveXObject){
    // code for IE6, IE5
    return new ActiveXObject("Microsoft.XMLHTTP");
  }
  return null;
}

function getFlickr(){
  xmlhttp=createXHR();

  url="http://www.flickr.com/services/rest/?method=flickr.photos.search&api_key=75564008a468bf8a284dc94bbd176dd8&tags=paris&";
  xmlhttp.onreadystatechange=stateChanged;
  xmlhttp.open("GET",url,true);
  xmlhttp.send(null);
}

function stateChanged(){
  if (xmlhttp.readyState==4){
     alert(xmlhttp.getAllResponseHeaders());  
     alert(xmlhttp.responseXML)
     alert(xmlhttp.responseText)
     var xmlDoc=xmlhttp.responseXML.documentElement;

  }
}

getFlickr();
</script>
0 голосов
/ 19 марта 2011

Крутая вещь в JSON заключается в том, что это фактически исполняемый код.Вам не нужно выполнять какой-либо "ручной" анализ - просто запустите код.Возможно, Flickr снабдит функцию jsonFlickrApi своими API-библиотеками, которые они не позволят вам использовать, но вы также можете предоставить и свою собственную.

function parseFlickrJson(jsonstring){
    var data=null;

    var jsonFlickrApi=function(d){
        data = d;
    }

    eval(jsonstring);

    return data;
}

myreturndata = parseFlickrJson(response);

// Try getting something from the object
alert(myreturndata.photos.pages);
...