JSON.синтаксический анализ числа в виде строки не выдает ошибку

#javascript #json

#javascript #json

Вопрос:

Я полагал, что это один из способов правильно отличить недопустимый объект JSON в виде строки от допустимого

 function isValidJson(s) {
  try {
    JSON.parse(s);
    return true;
  } catch (e) {
    return false;
  }
}

console.log(isValidJson(1234)); // true
console.log(isValidJson('1234')); // true
console.log(isValidJson('Is life a valid JSON?')); // false :(
console.log(isValidJson('{"a" : { "b": [1, 2, 3] }}')); // true  

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

Кроме того, прочитав документы MDN для JSON.parse, я нашел метод reviver . Я написал функцию, которая, похоже, работает для всех сценариев. Действительно ли эта функция будет правильным способом?

 function isValidJson(s) {
  try {
    JSON.parse(s, function(k, v) {
      if (k === "" amp;amp; typeof v === "number") {
        throw "Invalid JSON";
      }
      return v;
    });
    return true;
  } catch (e) {
    return false;
  }
}

console.log(isValidJson(1234)); // false
console.log(isValidJson('1234')); // false
console.log(isValidJson('Is life a valid JSON?')); // false :(
console.log(isValidJson('{"a" : { "b": [1, 2, 3] }}')); // true  

[ПРАВИТЬ] Возможно, я ошибочно подразумевал, что я хочу различать допустимые строки JSON. Я имел в виду допустимые объекты JSON в виде строк. Отредактировал вопрос в отношении этого.

Комментарии:

1. Считаете ли вы массивы объектами? Javascript выдает, а JSON — нет. А как насчет null?

2. ДА. Мне нужно, чтобы ‘[]’, а также ‘{}’ считались допустимыми. значение null не должно считаться допустимым, и я предполагаю, что мое решение не учитывает значение null. Я могу это изменить. Я больше склоняюсь к пониманию того, как JSON.parse не генерирует исключение, когда я передаю в него число или числовую строку.

3. Ваша первая функция не генерирует исключение, потому что числовая строка является точным JSON, ваша вторая функция фактически генерирует это «Недопустимое исключение JSON» в вашем if, поскольку оно возвращает false для ‘1234’. Поэтому я не понимаю вашего комментария.

Ответ №1:

Текст в формате JSON может быть любым из типов данных JSON.

 1234
  

… является допустимым JSON-текстом, состоящим из числа. (Передача 1234 в виде числа в JSON.parse works потому что оно преобразуется в строку по обычным правилам приведения типов JavaScript).

 "Is life a valid JSON?"
  

… является допустимым JSON-текстом, состоящим из строки.

 Is life a valid JSON?
  

… недопустимый текст в формате JSON. Это просто набор символов, которые не соответствуют синтаксису любого типа данных JSON.

Так что нет. Ваша вторая функция была бы неправильной. Он утверждает, что 1234 это недопустимый JSON.

Ответ №2:

Я думаю, что случай, когда isValidJsonString(1234) returns true — это просто Javascript, который, как обычно, стремится превратить вещи в строки при первой возможности. Если вы добавите в функцию проверку того, что аргумент на самом деле является строкой, все в порядке:

 function isValidJsonString(s) {
  if (typeof s !== 'string') {
    return false;
  }
  try {
    JSON.parse(s);
    return true;
  } catch (e) {
    return false;
  }
}
  

Остальные уже работают так, как должны.

Этот фрагмент фактически распознает числа и числа как строки как допустимые строки JSON. Может ли кто-нибудь пролить свет на то, почему / как это происходит?

Это происходит потому, что числа в виде строк являются допустимыми строками JSON.

[ПРАВИТЬ] Возможно, я ошибочно подразумевал, что я хочу различать допустимые строки JSON. Я имел в виду допустимые объекты JSON в виде строк. Отредактировал вопрос в отношении этого.

Ваш текущий метод также этого не делает, он исключает только числа.

Значениями JSON могут быть семь разных вещей: объект (в {} ), массив (в [] ), строка (в "" ), число, null , false или true . Из них вы исключаете только число.

Если вы используете typeof v !== "object" , то принимайте только объекты, массивы и null . Может быть, это то, что вы хотите, а может и нет.

Если вам нужны только объекты JSON, просто убедитесь, что первым символом, не содержащим пробелов, в вашей строке JSON является a { .