Ein JSON-Text muss mindestens zwei Oktette enthalten

70

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.parseMethode 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 nilWerte zuzulassen . Anregungen wäre sehr dankbar.

Cory
quelle
2
Möglicherweise aufgrund der Tatsache, dass eine absolut MINIMUM gültige Javascript-Zeichenfolge ist "", 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 dies nullauch ein gültiger Javascript-Wert ist.
Marc B

Antworten:

44
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)
Alex Wayne
quelle
Ja, obwohl ich das überall wiederholen müsste, versuche ich zu analysieren. Vielleicht sollte ich einen Patch einreichen.
Cory
Dem JSON-Modul wurde ein kleiner Mini-Patch hinzugefügt, den Sie stattdessen verwenden können. Es beinhaltet keine verrückte Methode, um Magie oder irgendetwas zu aliasen, und ist leicht wiederverwendbar.
Alex Wayne
@Alex Wo würden Sie den Mini-Patch bereitstellen, um dies in der gesamten App zu erfassen?
RSG
1
@AlexWayne warum nicht JSON.parse (json) wenn json.is_a? (String) && json.length> = 2
Mr. Demetrius Michael
besser zu tun, json = json.to_s.stripbevor Sie es in parse_nil akzeptieren
Amol Pujari
4
data.presence && JSON.parse(data)

JSON.parse(data.presence || '{}')
Денис Препелица
quelle
Vergib mir meine Unwissenheit (armer Windows-Typ). Muss ich die Zeilen 'data.presence &&' und 'JSON.parse' zu meiner Poddatei hinzufügen? Versuchte das, aber ich bekomme einen Fehler (wie Sie wahrscheinlich erwarten würden ...)
Yossi
3

Laut json.org

JSON basiert auf zwei Strukturen:

  1. 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.

  2. 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. :-)

Sagar Ranglani
quelle
Das stimmt nicht mehr. Ein RFC 7159 vom März 2014 aktualisiert diese Einschränkungen. Alle der folgenden sind gültig JSON: null, false, true, 42, "Some string", {},[]
Dan
Ich denke, es ist streng.
Calasyr
0
hash = JSON.parse(json) rescue {}
array = JSON.parse(json) rescue []
string = JSON.parse(json) rescue ''
Ich
quelle
9
Dies ist ziemlich schlecht, da es alles rettet, einschließlich aller anderen Arten von Parserfehlern, über die Sie wahrscheinlich Bescheid wissen möchten.
Mike Campbell