このエラーを受け取ったので、この質問に対する合理的な答えが見つからなかったので、問題の要約を書きたいと思いました。
このスニペットをirbで実行する場合:
JSON.parse( nil )
次のエラーが表示されます。
TypeError: can't convert nil into String
関数がnil
ではなくTypeError
を返すことを期待していました。 to_s
を使用してすべての入力を変換すると、オクテットエラーが表示されます。
JSON::ParserError: A JSON text must at least contain two octets!
それは結構です。オクテットがわからない場合は、この投稿で概要と解決策をお読みください: JSONオクテットとは何ですか?なぜ2つ必要ですか?
ソリューション
渡す変数は空の文字列です。 JSON.parse
メソッドで空の文字列を使用しようとしないでください。
質問
だから、今、私はエラーの原因を知っています、これを処理するためにどのパターンを使用する必要がありますか? JSONライブラリにnil
値を許可するようにパッチを適用するのは少し嫌です。どんな提案も大歓迎です。
parsed = json && json.length >= 2 ? JSON.parse(json) : nil
しかし実際には、ライブラリはこのケースを処理し、nilを返すことができるはずです。組み込みのJSONサポートを備えたWebブラウザーは、期待どおりに機能するようです。
または、わずかに邪魔にならないミニパッチでそれを行うには:
module JSON
def self.parse_nil(json)
JSON.parse(json) if json && json.length >= 2
end
end
parsed = JSON.parse_nil(json)
data.presence && JSON.parse(data)
JSON.parse(data.presence || '{}')
json.org による
JSONは2つの構造で構築されます。
名前/値のペアのコレクション。さまざまな言語では、これはオブジェクト、レコード、構造体、辞書、ハッシュテーブル、キー付きリスト、または連想配列として実現されます。
値の順序付きリスト。ほとんどの言語では、これは配列、ベクトル、リスト、またはシーケンスとして実現されます。
したがって、トップレベルで必要な最小2オクテット(8ビット)は{}
または []
IMO、最善の解決策は、JSON.parse
は、厳密なオブジェクトまたは厳密な配列のいずれかです。 :-)
hash = JSON.parse(json) rescue {}
array = JSON.parse(json) rescue []
string = JSON.parse(json) rescue ''