Средство восстановления синтаксического анализа JSON

#javascript #reviver-function

#javascript #средство восстановления-функция

Вопрос:

Я пытаюсь проанализировать список объектов JSON в переменную с именем jsonStructure с помощью функции восстановления, которая добавляет 5 к объекту ‘year’ в переменной StringData. Однако переменная возвращает значение undefined. Я не уверен, что я делаю не так, поскольку у меня анализатор настроен точно так, как указано в книге. Вот мой код ниже:

 var stringData = '{ "year": 2011, "month": 8, "day": 9, "hour": 5, "minute": 32 }';

var jsonStructure = JSON.parse(stringData, function (key, value) {
   if (key == "year")
      return value   5;
});
  

Ответ №1:

Проблема

Проблема здесь в том, что вы не возвращаете никакого значения, если ключ не совпадает year , что фактически делает все остальное неопределенным

Решение

Нам всегда нужно быть уверенными, что мы возвращаем значение из нашего средства восстановления:

 var stringData = '{ "year": 2011, "month": 8, "day": 9, "hour": 5, "minute": 32 }';

var jsonStructure = JSON.parse(stringData, function (key, value) {
  return key == "year" ? value   5 : value;
});


console.log(jsonStructure)  

Объяснение

С сайта документации MDN:

Использование параметра reviver

Если указан средство восстановления, значение, вычисленное путем синтаксического анализа, преобразуется перед возвращением. В частности, вычисленное значение и все его свойства (начиная с наиболее вложенных свойств и заканчивая самим исходным значением) индивидуально прогоняются через средство восстановления. Затем вызывается объект, содержащий свойство, обрабатываемое как this, с именем свойства в виде строки и значением свойства в качестве аргументов. Если функция восстановления возвращает значение undefined (или не возвращает значения, например, если выполнение прерывается в конце функции), свойство удаляется из объекта. В противном случае свойство переопределяется как возвращаемое значение.

Ответ №2:

 var stringData = '{ "year": 2011, "month": 8, "day": 9, "hour": 5, "minute": 32 }';

var jsonStructure = JSON.parse(stringData, function(key, value) {
  if (key == "year") {
    return value   5;
  }
  return value
});

console.log(jsonStructure);