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.


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)

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 || '{}')

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


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 ''

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.