что не так с этим анализом JSON с использованием YQL? - PullRequest
0 голосов
/ 11 июня 2011

Я хочу проанализировать удаленный JSON-файл, используя JQuery, YQL (вы знаете междоменную проблему, поэтому yql лучше)

но я не знаю, что пропускает в этом коде? index.html

<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
    <title>untitled</title>
    <style type="text/css">
        body { text-align: center; }
    </style>
</head>
<body onLoad="gova();">

    <div id="container">

    </div>
    <table id="userdata" border="1">
        <thead>
            <th>First Name</th>
            <th>Last Name</th>
            <th>Email Address</th>
            <th>City</th>
        </thead>
        <tbody></tbody>
    </table>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js" type="text/javascript" charset="utf-8"></script>    
<script type="text/javascript" src="cross-domain-requests.js"></script>

<script type="text/javascript">

function  gova() {
    var path = $('http://mapleleafrealities.com/jsondata.php').val();

    requestCrossDomain('http://mapleleafrealities.com/jsondata.php', function(results) {
        $('#container').html(results);

    });

    return false;
}

</script>
</body>
</html>

междоменное-requests.js

// Accepts a url and a callback function to run.
function requestCrossDomain( site, callback ) {

    // If no url was passed, exit.
    if ( !site ) {
        alert('No site was passed.');
        return false;
    }

    // Take the provided url, and add it to a YQL query. Make sure you encode it!
    var yql = 'http://query.yahooapis.com/v1/public/yql?q=' + encodeURIComponent('select * from html where url="' + site + '"') + '&format=xml&callback=?';

    // Request that YSQL string, and run a callback function.
    // Pass a defined function to prevent cache-busting.

    $.getJSON( yql, cbFunc );

    function cbFunc(data) {
    // If we have something to work with...
    if ( data.results[0] ) {
        // Strip out all script tags, for security reasons.
        // BE VERY CAREFUL. This helps, but we should do more. 
        data = data.results[0].replace(/<script[^>]*>[\s\S]*?<\/script>/gi, '');

        // If the user passed a callback, and it
        // is a function, call it, and send through the data var.
        if ( typeof callback === 'function') {
            callback(data);
        }
    }
    // Else, Maybe we requested a site that doesn't exist, and nothing returned.
    else throw new Error('Nothing returned from getJSON.');
    }
}

я хочу отображать неформатированные данные в таблицу? как ? Пожалуйста, дайте решение, где проблема или чего не хватает?

спасибо заранее !! :)

Ответы [ 2 ]

2 голосов
/ 12 июня 2011

Я хочу проанализировать удаленный файл JSON с помощью JQuery, YQL

Вы говорите, что хотите проанализировать некоторый JSON, но ваш запрос YQL запрашивает HTML, а URL YQL запрашиваетОтвет XML!

var yql = 'http://query.yahooapis.com/v1/public/yql?q=' + encodeURIComponent('select * from html where url="' + site + '"') + '&format=xml&callback=?';

Если вы действительно хотите работать с JSON, измените эту строку на что-то вроде ниже.Он а) использует таблицу json (поскольку это характер содержимого site) и б) говорит YQL вернуть JSON , потому что вы используете функцию jQuery.getJSON()!

var yql = 'http://query.yahooapis.com/v1/public/yql?'
        + 'q=' + encodeURIComponent('select * from json where url=@url')
        + '&url=' + encodeURIComponent(site)
        + '&format=json&callback=?';

Теперь, когда YQL возвращает JSON, вы можете получить объект json через data.query.results.json, который затем содержит массив объектов userdata.Посмотрите более полный пример, основанный на вашем коде, который принимает ответ JSON от YQL и заполняет строки таблицы, используя jQuery.template()

http://jsbin.com/umuri5/edit

2 голосов
/ 11 июня 2011

Два тонких:

1) JSON возвращается не очень хорошо сформирован.По какой-то причине элемент userdata имеет префикс "\ n

", что делает недоступным элемент userdata элемента,

2) Вы должны использовать data.results [0] .userdata для итерации по каждому пользователю.:

$.each(data.results[0].userdata, function(i,user){
        var tblRow =
                "<tr>"
                +"<td>"+user.first+"</td>"
                +"<td>"+user.last+"</td>"
                +"<td>"+user.email+"</td>"
                +"<td>"+user.city+"</td>"
                +"</tr>"
        $(tblRow).appendTo("#userdata tbody");
});
...