2016-12-02 3 views
4

Ich schrieb eine Funktion, um Json-Objekte in Python zu validieren. Hier ist das Code-Snippet:Gehört die Ziffernfolge zu Json?

Allerdings habe ich zufällig gefunden, dass es Ziffernfolge ermöglicht. Zum Beispiel

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

Von meinem Verständnis, Nummer sollte nicht Teil der JSON-Daten sein. Und ich habe es auch mit einigen anderen Json formatter tool bestätigt. Wenn es wahr ist, warum würde json.loads Ziffernfolgen zulassen?

+0

whicg Python-Version? –

+0

@ ItayMoav-Malimovka Python 2.7.12 – ichbinblau

+1

@Kevin ja Python scheint RFC 7159 zu verwenden, daher ist dies richtig. https://docs.python.org/3/library/json.html –

Antwort

4

Es sieht aus wie der Python json Modul JSON von RFC unterstützt 7159:

JSON (JavaScript Object Notation), spezifiziert durch RFC 7159 mit dem

Herumspielen (die RFC 4627 obsoletes) Validator Sie verbunden, "123" ist in 4627 ungültig, aber in 7159 gültig.

Vergleicht man die zwei RFCs, sieht es so aus, als ob die Definition dessen, was gültigen JSON-Text umfasst, breiter wird. In 4627:

JSON-text = object/array

Und in 7159:

JSON-text = ws value ws

(ws "optional Leerzeichen" bedeutet)

So ursprünglich Sie konnten nur habe ein o bject oder ein Array, aber jetzt können Sie einen Wert haben, der "ein Objekt, ein Array, eine Zahl oder ein String oder ein [...] Name ist: false null true".

Die json Modul Dokumentation beschreibt die Differenz weiter:

die alte Version von JSON durch Löschen veralteter RFC 4627 erforderlich, dass die Top-Level-Wert eines JSON Text entweder ein JSON Objekt oder Array sein muss (Python dict oder list) und konnte kein JSON-Wert für null, boolean, number oder string sein. RFC 7159 hat diese Einschränkung entfernt, und dieses Modul hat diese Einschränkung weder in seinem Serializer noch in seinem Deserializer implementiert und nie implementiert.

+0

Was ist, wenn ich möchte, dass meine Funktion dem RFC 4627 entspricht? Ich möchte Zahlen in der Validator-Funktion ausschließen? – ichbinblau

+1

@ this-vidor, hoppla, ich dachte, ein "Wert" wäre gleichbedeutend mit "einem gültigen eigenständigen JSON-Dokument", aber es ist wirklich "JSON-Text". Bearbeitet. – Kevin

+0

@Theresa, es sieht nicht so aus, als gäbe es keine einfache Möglichkeit, einen strikten RFC 4627-konformen Parser mit nur den eingebauten Modulen zu erstellen.Im Prinzip könnten Sie Ihren eigenen Parser schreiben (vielleicht mit Lex/Yacc/Flex/Bison), aber das ist ein sehr "batteries non included" Ansatz (und ich bin mir nicht einmal sicher, wie diese Tools in Python integriert werden, wenn überhaupt). – Kevin