#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, вводится в поле, которое должно было быть anumber
. Для безопасности типов 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, а в том, как работать с полным стеком с несоответствиями.