Почему MongoDB допускает значение NaN, когда NaN не поддерживается JSON?

#javascript #json #python-3.x #mongodb #nan

#javascript #json #python-3.x #mongodb #nan

Вопрос:

Я хотел бы услышать об этом от эксперта по Монго. Ответы до сих пор были получены со стороны JavaScript.

Вот мой сценарий. Я использовал Python / Pandas для чтения CSV и преобразования в JSON для хранения в MongoDB. У меня также есть Python AWS Lambda API, доступный для JavaScript. Данные с неверным значением в конечном итоге получили значение NaN, и MongoDB принимает это просто отлично, а словарь Python обрабатывает это нормально и сериализует в JSON. Но JavaScript не может его разобрать. Мое временное исправление состояло в том, чтобы изменить NaN на 0 на данный момент (в базе данных).

Я пытаюсь понять, почему MongoDB / Python допускают это, но JavaScript этого не делает. Это из-за отсутствия стандартов в самом JSON?

Если я положу это в JSONLint.com , он быстро выявляет проблему.

 {
    "name": "test",
    "value": NaN
}
 

В JavaScript мы получаем ParseError при вызове Ajax (сокращенная версия):

     $.ajax({
        type: "POST",
        url: "https://da987tkpjg.execute-api.us-east-1.amazonaws.com/PROD",
        data: JSON.stringify({
            "body":{ ...
            }
        }),
        success: function(msg){
            console.log(msg);
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            console.log(textStatus);
            console.log(errorThrown);
        }
      });
 

Ответ №1:

Это потому, что NaN не поддерживается:

Числа

Начальные нули запрещены. За десятичной запятой должна следовать хотя бы одна цифра. NaN и Infinity не поддерживаются.

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

1. Тогда как MongoDB принимает его, разве он не основан на JSON?

Ответ №2:

NaN недопустимое значение JSON.

Значением может быть строка в двойных кавычках, или число, или true, или false, или null, или объект, или массив. Эти структуры могут быть вложенными.
(источник)

Вам нужно будет отфильтровать эти значения в python.

Это не «отсутствие стандартов» в спецификации JSON, вы просто выводите неверно отформатированный JSON.


Что касается того, почему MongoDB возвращается NaN :

Я предполагаю, что это запасной вариант, тогда что-то, что не number является a, вводится в поле, которое должно было быть a number . Для безопасности типов MongoDB не может просто вернуть это что-то, поэтому он дает вам лучшее, что он может вам сказать : NaN .

Обратите внимание, что NaN это концепция JavaScript. JSON основан на объектной нотации JS, но в остальном он не связан.

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

1. Тогда как MongoDB принимает его, разве он не основан на JSON?

2. Я предполагаю, что это запасной вариант, тогда что-то, что не number является a, вводится в поле, которое должно было быть a number . Для безопасности типов MongoDB не может просто вернуть это что-то, поэтому он дает вам лучшее, что он может вам сказать : NaN . Обратите внимание, что NaN это концепция JavaScript . JSON основан на объектной нотации JS, но в остальном он не связан.

3. Pandas установил значение NaN в фрейме данных, который был помещен в словарь Python, Python сохранил его в MongoDB с помощью PyMongo. Итак, я пытаюсь узнать, чем MongoDB «JSON» отличается от JavaScript «JSON» — если это имеет смысл. Затем Lambda сериализует «JSON» также с помощью Python, и с этим проблем не было.

4. Я не знаю, что тебе сказать. Спецификация JSON понятна, NaN не разрешена, все просто. Вам нужно будет устранить эту проблему на стороне сервера.

5. Проблема была устранена. Вопрос не в том, поддерживает ли Javascript NaN, а в том, как работать с полным стеком с несоответствиями.