71 votes

Un texte JSON doit contenir au moins deux octets.

J'ai reçu cette erreur, et je ne pouvais pas trouver aucune réponse raisonnable à cette question, alors j'ai pensé que je ferais un résumé du problème.

Si vous exécutez ce code de la cisr:

JSON.parse( nil )

Vous allez définir le message d'erreur:

TypeError: can't convert nil into String

J'étais attendent à la fonction de retour à zéro, et non pas une exception TypeError. Si vous convertissez toutes les entrées à l'aide d'un .to_s, vous verrez alors l'octet d'erreur:

JSON::ParserError: A JSON text must at least contain two octets!

C'est très bien, et le bien, mais si vous ne savez pas ce qu'est un octet, lisez ce post pour un résumé et une solution:

Qu'est-ce que JSON octet? et Pourquoi deux?

Solution

La variable que vous êtes de passage dans est une chaîne vide. N'essayez pas d'utiliser une chaîne vide dans le JSON.méthode d'analyse.

Question

Donc je sais que je sais que la cause de l'erreur, quel modèle dois-je utiliser pour gérer cela? Je suis un peu réticent à monkey patch de la librairie JSON pour permettre à néant valeurs. Toutes les suggestions sont grandement appréciés.

44voto

Alex Wayne Points 58113
 parsed = json && json.length >= 2 ? JSON.parse(json) : nil
 

Mais, en réalité, la bibliothèque devrait pouvoir traiter ce cas et renvoyer zéro. Les navigateurs Web avec prise en charge JSON intégrée semblent fonctionner comme vous le souhaitez après tout.


Ou pour le faire avec un mini patch peu intrusif:

 module JSON
  def self.parse_nil(json)
    JSON.parse(json) if json && json.length >= 2
  end
end

parsed = JSON.parse_nil(json)
 

0voto

Ich Points 320
hash = JSON.parse(json) rescue {}
array = JSON.parse(json) rescue []
string = JSON.parse(json) rescue ''

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X