Вместо того, чтобы бросать код на вас, есть два понятия, которые являются ключом к пониманию того, как JS обрабатывает обратные вызовы и асинхронность. (это даже слово?)
Есть три вещи, о которых вам нужно знать; Очередь; цикл события и стек
. В широких упрощенных терминах цикл событий подобен диспетчеру проекта, он постоянно прослушивает любые функции, которые хотят запускать и взаимодействовать между очереди и стека.
while (queue.waitForMessage()) {
queue.processNextMessage();
}
Как только он получает сообщение для запуска чего-то, он добавляет его в очередь. Очередь - это список вещей, которые ждут выполнения (например, ваш запрос AJAX). Представьте себе это так:
1. call foo.com/api/bar using foobarFunc
2. Go perform an infinite loop
... and so on
Когда одно из этих сообщений будет исполнено, оно выталкивает сообщение из очереди и создает стек, стек - это все, что нужно выполнить JS для выполнения инструкции в сообщение. Таким образом, в нашем примере ему говорят позвонить foobarFunc
function foobarFunc (var) {
console.log(anotherFunction(var));
}
. Так что все, что foobarFunc должно выполнить (в нашем случае anotherFunction
), будет вставлено в стек. исполняемый, а затем забытый - цикл события затем переместится на следующую вещь в очереди (или прослушивает сообщения)
. Главное здесь - порядок выполнения. Это
Когда вы совершаете вызов с использованием AJAX для внешней стороны или выполняете любой асинхронный код (например, setTimeout), Javascript зависит от ответ, прежде чем он сможет продолжить.
Большой вопрос, когда он получит ответ? Ответ в том, что мы не знаем, поэтому цикл событий ждет, когда это сообщение скажет: «Эй, забери меня». Если JS просто ждал этого сообщения синхронно, ваше приложение замерзнет, и оно сосать. Таким образом, JS продолжает выполнение следующего элемента в очереди, ожидая, пока сообщение не будет добавлено обратно в очередь.
Вот почему с асинхронной функциональностью мы используем вещи, называемые обратными вызовами. Это похоже на обещание буквально. Как и в I , обещание что-то вернуть в какой-то момент jQuery использует специальные обратные вызовы, называемые deffered.done
deffered.fail
и deffered.always
(среди других). Вы можете увидеть их все здесь
Итак, вам нужно передать функцию, которая в какой-то момент будет выполнена с переданными ей данными.
Поскольку обратный вызов не выполняется немедленно, но в более позднее время важно передать ссылку на функцию, которую она не выполнила. поэтому
function foo(bla) {
console.log(bla)
}
, поэтому большую часть времени (но не всегда) вы пройдете foo
не foo()
. Надеюсь, это будет иметь смысл. Когда вы сталкиваетесь с такими вещами, которые кажутся запутанными, я настоятельно рекомендую полностью прочитать документацию, чтобы хотя бы понять ее. Это сделает вас намного лучшим разработчиком.
Использование JSON.parse, вероятно, лучший способ. Вот пример live demo
var jsonRes = '{ "students" : [' +
'{ "firstName":"Michel" , "lastName":"John" ,"age":18},' +
'{ "firstName":"Richard" , "lastName":"Joe","age":20 },' +
'{ "firstName":"James" , "lastName":"Henry","age":15 } ]}';
var studentObject = JSON.parse(jsonRes);
Более старый вопрос, я знаю, однако никто не замечает этого решения, используя new Function()
, анонимную функцию, которая возвращает данные.
Просто пример:
var oData = 'test1:"This is my object",test2:"This is my object"';
if( typeof oData !== 'object' )
try {
oData = (new Function('return {'+oData+'};'))();
}
catch(e) { oData=false; }
if( typeof oData !== 'object' )
{ alert( 'Error in code' ); }
else {
alert( oData.test1 );
alert( oData.test2 );
}
Это немного более безопасно, потому что он выполняет внутри функции и не компилируется в вашем коде напрямую. Поэтому, если внутри него есть объявление функции, оно не будет привязано к объекту окна по умолчанию.
Я использую это для «компиляции» параметров конфигурации элементов DOM (например, атрибута данных) простым и быстрым.
Если вы хотите, чтобы этот метод можно было использовать таким образом. Вот объект Data, который вы хотите использовать ex: Data = '{result: true, count: 1}'
try {
eval('var obj=' + Data);
console.log(obj.count);
}
catch(e) {
console.log(e.message);
}
Этот метод действительно помогает в Nodejs Если вы работаете с программированием последовательного порта
Разбираем строку json с помощью JSON.parse (), и данные становятся объектами JavaScript.
JSON.parse(jsonString)
Здесь JSON представляет процесс обработки набора данных json.
Пример, Представьте, что мы получили этот текст с веб-сервера:
'{ "name":"John", "age":30, "city":"New York"}'
Чтобы разобрать на json-объект:
var obj = JSON.parse('{ "name":"John", "age":30, "city":"New York"}');
Здесь obj - соответствующий объект JSON, который выглядит следующим образом.
{ "name":"John", "age":30, "city":"New York"}
Для выбора используемого значения. оператор EXample:
obj.name // John
obj.age //30
Чтобы передать противоположное, преобразуйте объект JavaScript в строку с помощью JSON.stringify ().
Самый простой способ использования метода parse()
:
var response = '{"result":true,"count":1}';
var JsonObject= JSON.parse(response);
, тогда вы можете получить значения элементов Json
, например:
var myResponseResult = JsonObject.result;
var myResponseCount = JsonObject.count;
Используя jQuery , как описано в документации :
JSON.parse(jsonString);
Просто для удовольствия, вот как использовать функцию:
jsonObject = (new Function('return ' + jsonFormatData))()
JSON.parse () преобразует любую строку JSON, переданную в функцию, в объект JSON.
Для лучшего понимания нажмите F12, чтобы открыть элемент Inspect Element своего браузера и перейти к консоли, чтобы написать следующие команды: -
var response = '{"result":true,"count":1}'; //sample json object(string form)
JSON.parse(response); //converts passed string to JSON Object.
Теперь запустите команду: -
console.log(JSON.parse(response));
вы получите вывод как Object {result: true, count: 1}.
Чтобы использовать этот объект, вы можете назначить его переменной, скажем, obj: -
var obj = JSON.parse(response);
Теперь, используя оператор obj и dot (.), Вы можете получить доступ к свойствам объекта JSON.
Попробуйте запустить команду
console.log(obj.result);
Метод jQuery теперь устарел. Вместо этого используйте этот метод:
let jsonObject = JSON.parse(jsonString);
Оригинальный ответ с использованием устаревшей функции jQuery :
Если вы используете jQuery, просто используйте:
jQuery.parseJSON( jsonString );
Официально документировано:
Метод JSON.parse()
анализирует строку JSON, создавая значение или объект JavaScript, описанные в строке. Опция reviver
может быть предоставлена для выполнения преобразования на результирующем объекте до его возвращения.
Синтаксис
JSON.parse(text[, reviver])
Параметры
текст
Строка для синтаксического анализа как JSON. См. Объект JSON для описания синтаксиса JSON.
reviver (необязательно)
Если функция, это предписывает, как значение, первоначально созданное путем синтаксического анализа, преобразуется перед возвратом.
Возвращаемое значение
Объект, соответствующий данному тексту JSON.
Исключения
Выдает исключение SyntaxError, если строка для разбора не является действительный JSON.
Преобразование объекта в JSON, а затем его разбор, работает для меня, например:
JSON.parse(JSON.stringify(object))
JSON.parse(jsonString);
json.parse изменится на объект.
Попробуйте это. Этот текст написан в машинописном тексте.
export function safeJsonParse(str: string) {
try {
return JSON.parse(str);
} catch (e) {
return str;
}
}
Разбор JSON - это всегда боль в заднице. Если вход не соответствует ожиданиям, он выдает ошибку и выдает сбой, что вы делаете. Вы можете использовать следующую крошечную функцию для безопасного анализа ввода. Он всегда превращает объект, даже если вход недействителен или уже является объектом, который лучше для большинства случаев.
JSON.safeParse = function (input, def) {
// Convert null to empty object
if (!input) {
return def || {};
} else if (Object.prototype.toString.call(input) === '[object Object]') {
return input;
}
try {
return JSON.parse(input);
} catch (e) {
return def || {};
}
};
Я уже давно использовал json_sans_eval . Согласно его автору, он более безопасен, чем json2.js.
Javascript (как браузер, так и NodeJS) имеют встроенный объект JSON
. На этом объекте есть два удобных метода для работы с JSON
. Они следующие:
JSON.parse()
Принимает JSON
в качестве аргумента, возвращает объект JS JSON.stringify()
Принимает объект JS в качестве аргумента возвращает объект JSON
Кроме того, для очень удобного использования JSON
они могут использоваться для других средств. Комбинация обоих методов JSON
позволяет нам очень легко сделать глубокие клоны массивов или объектов. Например:
let arr1 = [1, 2, [3 ,4]];
let newArr = arr1.slice();
arr1[2][0] = 'changed';
console.log(newArr); // not a deep clone
let arr2 = [1, 2, [3 ,4]];
let newArrDeepclone = JSON.parse(JSON.stringify(arr2));
arr2[2][0] = 'changed';
console.log(newArrDeepclone); // A deep clone, values unchanged
Изменить: этот ответ для IE & lt; 7, для современных браузеров проверьте ответ Джонатана выше.
Редактирование: этот ответ устарел и Ответ Джонатана выше (JSON.parse(jsonString)
) теперь лучший ответ.
JSON.org имеет парсер JSON для многих языков, включая 4 разных для Javascript. Я считаю, что большинство людей рассмотрят json2.js свою реализацию goto.