2016-12-02 2 views
4

Я написал функцию для проверки объектов Json в Python. Вот фрагмент кода:Строка цифр принадлежит Json?

def is_json(myjson): 
    """ 
    Check whether a string is a json object. 
    :param myjson: the string to check 
    :return: True/False 
    """ 
    try: 
     json_object = json.loads(myjson) 
    except ValueError, e: 
     return False 
    return True 

Однако, мне удалось найти цифровую строку. Например,

is_json("123") # return True 
is_json("-123") # return True 
is_json("0123") # return False 
is_json(" 123") # return True 

С моей точки зрения, номер не должен быть частью данных Json. И я также подтвердил это с некоторыми другими Json formatter tool. Если это так, почему бы json.loads разрешить строки цифр?

+0

whicg python версия? –

+0

@ ItayMoav-Malimovka Python 2.7.12 – ichbinblau

+1

@Kevin Да, python, похоже, использует RFC 7159, следовательно, это правильно. https://docs.python.org/3/library/json.html –

ответ

4

Похоже json модуль Python поддерживает JSON определяется RFC 7159:

JSON (нотация объект JavaScript), указанный в RFC 7159 (который Obsoletes RFC 4627)

Игра вокруг с валидатор, который вы связали, «123» недействителен в 4627 году, но действителен в 7159.

Сравнивая два RFC, похоже, что определение того, что содержит действительный текст JSON, становится более широким. В 4627:

JSON-text = object/array

И в 7159:

JSON-text = ws value ws

(WS означает "дополнительный пробел")

Так первоначально вы могли только иметь o bject или массив, но теперь вы можете иметь значение, которое представляет собой «объект, массив, число или строку», или одно из имен [...]: false null true ».

Модуль документация json обсуждает разницу дальше:

Старая версия JSON определяется устаревшим RFC 4627 требует, чтобы значение верхнего уровня текста JSON должно быть либо объектом JSON или массив (Python dict или list) и не может быть значением JSON null, boolean, number или string. RFC 7159 удалил это ограничение, и этот модуль не выполняет и никогда не применял это ограничение ни в своем сериализаторе, ни в его десериализаторе.

+0

Что делать, если я хочу, чтобы моя функция придерживалась RFC 4627 cos. Я хочу исключить числа в функции валидатора? – ichbinblau

+1

@ this-vidor, whoops, я подумал, что «ценность» была синонимом «действительного автономного документа JSON», но на самом деле это 'JSON-text'. Ред. – Kevin

+0

@Theresa, не похоже, что есть простой способ сделать строгий RFC 4627-совместимый парсер, используя только встроенные модули.В принципе вы можете написать свой собственный парсер (возможно, используя Lex/Yacc/Flex/Bison), но это очень «не включенный в комплект» подход (и я даже не уверен, как эти инструменты интегрируются с Python, если вообще). – Kevin

Смежные вопросы