Почему json.load считает текстовое представление цифр валидным json?

>>> json_object = json.loads("60")
>>> json_object
60

json.loads(60) — ошибка, json.loads("aa") — ошибка, а вот json.loads("60") никаких ошибок не выдает, и отличить я json от строки с цифрами не могу. Два вопроса:
1)Почему так?
2)Как отличить json от числа, если мне пришла текстовая строка?
  • Вопрос задан
  • 142 просмотра
Пригласить эксперта
Ответы на вопрос 3
Aetae
@Aetae
Тлен
Очевидно, что литерал "60" - это строка 60. Строка 60 - это json от числа 60.
Json же для строки аа - это строка "аа", и литерал для такой строки будет "\"аа\"".

В качестве данных в памяти хранятся само собой чистые строки, так что с приходящими извне данными проблем у вас не будет.
Ответ написан
Комментировать
@rPman
по стандарту, json это константа в формате javascript, под которые попадают просто числа
value = false / null / true / object / array / number / string


на практике, передавать только число почти бессмысленно (хотя для строк можно найти задачу), поэтому все что не имеет формата object или array можно не считать json (не советую завязывать в своей программе формат через тип передаваемых данных, лучше делай его строже)

чтобы это определить, не обязательно парсить json (хотя это просто и современные парсеры жуть какие быстрые), достаточно проверить первый не пустой символ строки на '[' или '{'
Ответ написан
Комментировать
По первому вопросу из wiki:

В качестве значений в JSON могут быть использованы:

  1. запись — это неупорядоченное множество пар ключ:значение, заключённое в фигурные скобки «{ }». Ключ описывается строкой, между ним и значением стоит символ «:». Пары ключ-значение отделяются друг от друга запятыми. Пример: {"hasBrain": false", "name": "Zombie"}
  2. массив (одномерный) — это упорядоченное множество значений. Массив заключается в квадратные скобки «[ ]». Значения разделяются запятыми. Массив может быть пустым, то есть не содержать ни одного значения. Значения в пределах одного массива могут иметь разный тип. Пример: [1, 2, "a", 7, true, {"a": "b"}]
  3. число (целое или вещественное). Пример: -11.2
  4. литералы true (логическое значение «истина»), false (логическое значение «ложь») и null.
  5. строка — это упорядоченное множество из нуля или более символов юникода, заключённое в двойные кавычки. Символы могут быть указаны с использованием escape-последовательностей, начинающихся с обратной косой черты «\» (поддерживаются варианты \", \\, \/, \t, \n, \r, \f и \b), или записаны шестнадцатеричным кодом в кодировке Unicode в виде \uFFFF. Пример: "asdasd"


"60" - это пункт 5
aa - это никакой из пунктов.

По второму вопросу:
1. Если json.load вызвал ошибку то это точно не json.
2. Но любой json это строка по определению, потому что это текстовый формат данных.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы