Как мне разобрать JSON без jQuery - PullRequest
       5

Как мне разобрать JSON без jQuery

0 голосов
/ 08 сентября 2010

Некоторая информация - я создаю автозаполнение, которое получает данные из фида json. Часть JSON работает нормально, и результат действителен.

Когда я получаю его, я использую json2.js и запускаю JSON.parse. Когда я пытаюсь вывести его, он говорит мне, что он (объект, содержащий проанализированный текст JSON) на самом деле не определен.

Если я запускаю оповещение об объекте, а затем выводю его, оно работает. Это наверное что-то довольно простое. Но это немного сбивает с толку, так как работает нормально, если я предупреждаю объект

Я знаю, что это не сработает во всем, сейчас я просто пытаюсь заставить его работать и улучшу его.

Спасибо, и если я смогу предоставить больше информации, я сделаю это.

код

//sURL takes a search term that's passed into the function

var JSON_object = {};
var oRequest = new XMLHttpRequest();
var sURL  = "datalinkhere"+input.value;

oRequest.open("GET",sURL,true);
oRequest.setRequestHeader("User-Agent",navigator.userAgent);
oRequest.onreadystatechange = function () {
    if (oRequest.readyState == 4 && oRequest.status == 200)
    {
        JSON_object = JSON.parse( oRequest.responseText );
    }
};
oRequest.send(null);

suggestion(JSON_object,input);

function suggestion(inp,targetid)
{
    document.getElementById('autosuggest').style.display='block';
    document.getElementById('autosuggest').innerHTML=inp[1].namefield;
}

Ответы [ 4 ]

2 голосов
/ 08 сентября 2010

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

Таким образом, вы можете получить удачу, и данные будут доступны, когда следующая строка (предположительный вызов), и ваш код работает, или вы получите неопределенную переменную.

Вам придется писать свой код асинхронно: поместите вызов предложения сразу после вызова JSON.parse, и все будет работать какочарование.

2 голосов
/ 08 сентября 2010

Вас может заинтересовать функция, которую использует jQuery:

parseJSON: function( data ) {
    if ( typeof data !== "string" || !data ) {
        return null;
    }

    // Make sure leading/trailing whitespace is removed (IE can't handle it)
    data = jQuery.trim( data );

    // Make sure the incoming data is actual JSON
    // Logic borrowed from http://json.org/json2.js
    if ( /^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
        .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")
        .replace(/(?:^|:|,)(?:\s*\[)+/g, "")) ) {

        // Try to use the native JSON parser first
        return window.JSON && window.JSON.parse ?
            window.JSON.parse( data ) :
            (new Function("return " + data))();

    } else {
        jQuery.error( "Invalid JSON: " + data );
    }
}

Здесь есть несколько методов jQuery, а именно: trim и error. Вы можете узнать, что это такое, прочитав источник: http://code.jquery.com/jquery-1.4.2.js

Интересная часть этого бита:

// Try to use the native JSON parser first
return window.JSON && window.JSON.parse ?
    window.JSON.parse( data ) :
    (new Function("return " + data))();

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

1 голос
/ 08 сентября 2010

Try JSON_object = eval (oRequest.responseText);

0 голосов
/ 08 сентября 2010

Лучший JavaScript для этого - функция JSON.parse из json2.js, которую вы можете загрузить с http://www.json.org/js.html. Это самая официальная версия JSON.parse и JSON.stringify. Кстати, реализация проверит, имеет ли веб-браузер внутреннюю реализацию этих функций, и использует их, если они существуют.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...