Ich habe diesen Fehler erhalten und konnte keine vernünftige Antwort auf diese Frage finden. Daher dachte ich, ich würde eine Zusammenfassung des Problems schreiben.
Wenn Sie dieses Snippet in irb ausführen:
JSON.parse( nil )
Sie sehen den folgenden Fehler:
TypeError: can't convert nil into String
Ich hatte erwartet, dass die Funktion zurückkehren würde nil
, und nicht a TypeError
. Wenn Sie alle Eingaben mit konvertieren to_s
, wird der Oktettfehler angezeigt:
JSON::ParserError: A JSON text must at least contain two octets!
Das ist gut so. Wenn Sie nicht wissen, was ein Oktett ist, lesen Sie diesen Beitrag, um eine Zusammenfassung und Lösung zu erhalten: Was ist ein JSON-Oktett und warum sind zwei erforderlich?
Lösung
Die Variable, die Sie übergeben, ist eine leere Zeichenfolge. Versuchen Sie nicht, eine leere Zeichenfolge in der JSON.parse
Methode zu verwenden.
Frage
Nun, da ich die Fehlerursache kenne, welches Muster sollte ich verwenden, um damit umzugehen? Ich hasse es ein bisschen, die JSON-Bibliothek mit Affen zu patchen, um nil
Werte zuzulassen . Anregungen wäre sehr dankbar.
quelle
""
, die zwei Oktette beträgt (und ein absolutes Minimum-Objekt ist{}
). Könnte sein, wer auch immer geschrieben hat, dass Encoder / Parser nicht berücksichtigt hat, dass diesnull
auch ein gültiger Javascript-Wert ist.Antworten:
parsed = json && json.length >= 2 ? JSON.parse(json) : nil
Aber eigentlich sollte die Bibliothek in der Lage sein, diesen Fall zu behandeln und null zurückzugeben. Webbrowser mit integrierter JSON-Unterstützung scheinen schließlich genau so zu funktionieren, wie Sie es erwarten.
Oder um es mit einem nur leicht aufdringlichen Mini-Patch zu tun:
module JSON def self.parse_nil(json) JSON.parse(json) if json && json.length >= 2 end end parsed = JSON.parse_nil(json)
quelle
json = json.to_s.strip
bevor Sie es in parse_nil akzeptierendata.presence && JSON.parse(data) JSON.parse(data.presence || '{}')
quelle
Laut json.org
JSON basiert auf zwei Strukturen:
Eine Sammlung von Name / Wert-Paaren. In verschiedenen Sprachen wird dies als Objekt, Datensatz, Struktur, Wörterbuch, Hash-Tabelle, Schlüsselliste oder assoziatives Array realisiert.
Eine geordnete Liste von Werten. In den meisten Sprachen wird dies als Array, Vektor, Liste oder Sequenz realisiert.
Also mindestens zwei Bytes (8 Bit) auf der obersten Ebene erforderlich wären
{}
oder[]
IMO, die beste Lösung wäre, das Argument dafür sicherzustellen
JSON.parse
entweder ein strigifiziertes Objekt oder ein strigifiziertes Array ist. :-)quelle
null
,false
,true
,42
,"Some string"
,{}
,[]
hash = JSON.parse(json) rescue {} array = JSON.parse(json) rescue [] string = JSON.parse(json) rescue ''
quelle