web-dev-qa-db-ja.com

JSONテキストには少なくとも2オクテットが含まれている必要があります

このエラーを受け取ったので、この質問に対する合理的な答えが見つからなかったので、問題の要約を書きたいと思いました。

このスニペットを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値を許可するようにパッチを適用するのは少し嫌です。どんな提案も大歓迎です。

62
Cory
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)
43
Alex Wayne
data.presence && JSON.parse(data)

JSON.parse(data.presence || '{}')

json.org による

JSONは2つの構造で構築されます。

  1. 名前/値のペアのコレクション。さまざまな言語では、これはオブジェクト、レコード、構造体、辞書、ハッシュテーブル、キー付きリスト、または連想配列として実現されます。

  2. 値の順序付きリスト。ほとんどの言語では、これは配列、ベクトル、リスト、またはシーケンスとして実現されます。

したがって、トップレベルで必要な最小2オクテット(8ビット)は{} または []

IMO、最善の解決策は、JSON.parseは、厳密なオブジェクトまたは厳密な配列のいずれかです。 :-)

3
Sagar Ranglani
hash = JSON.parse(json) rescue {}
array = JSON.parse(json) rescue []
string = JSON.parse(json) rescue ''
0
Ich