2011-12-05 18 views
56

このエラーが発生しましたが、この質問に対する合理的な回答が見つかりませんでした。JSONテキストに少なくとも2つのオクテットが含まれている必要があります

あなたはIRBでこのスニペットを実行した場合:

JSON.parse(nil) 

を次のエラーが表示されます:

TypeError: can't convert nil into String 

私は一種のTypeErrornilを返すために機能を期待し、いませんでした。ちょうど罰金と同様だ

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

:あなたはto_sを使用して、すべての入力を変換する場合は、オクテットのエラーが表示されます。あなたはオクテットが何であるかわからない場合は、概要および解決のために、この記事をお読みください。 What is a JSON octet and why are two required?

ソリューション

あなたが渡している変数が空の文字列です。 JSON.parseメソッドで空の文字列を使用しないでください。

質問

だから、今、私は、エラーの原因を知って、どのようなパターン私はこれを処理するために使用する必要がありますか?私は猿のパッチに少し嫌悪感は、nil値を可能にするJSONライブラリです。どんな提案も大歓迎です。

+2

'「」 '、2つのオクテットである(絶対最低限オブジェクトは' {} ')。エンコーダ/パーサが 'null'も有効なjavascript値であるとは考えていないと書いた人がいます。 –

答えて

41
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) 
+0

はい、どこでもこれを繰り返して解析する必要があります。おそらく私はパッチを提出するべきです。 – Cory

+0

代わりに使用できるJSONモジュールに少しのミニパッチを追加しました。それは、魔法のようなエイリアシングの方法を必要とせず、簡単に再利用できます。 –

+0

@Alexアプリ全体でこれをキャッチするためにミニパッチをどこに配備しますか? – RSG

0
hash = JSON.parse(json) rescue {} 
array = JSON.parse(json) rescue [] 
string = JSON.parse(json) rescue '' 
+9

これはかなり悪いそれはあなたがおそらく知りたい他のすべてのタイプのパーサエラーを含む何かを救済します。 –

+0

それは本当です。あなたはそれを知って、どのような場合に有用かを決める必要があります... – Ich

3

JSONは、二つの構造の上に構築されていjson.org

によると:

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

  2. 値の順序付きリスト。ほとんどの言語では、これは配列、ベクトル、リスト、またはシーケンスとして実現されます。だから、トップレベルで必要な最小の2つのオクテット(8ビット)はIMO {}または[]

    だろう、最善の解決策はJSON.parseに必ず議論をすることであろう

されるかstrigifiedオブジェクトまたは縞模様の配列。:-)

最小限有効なJavaScript文字列であるという事実におそらく起因
+0

これはもはや真です。 2014年3月からの[RFC 7159](https://tools.ietf.org/html/rfc7159)では、これらの制限が更新されています。 JSON: 'null'、' false'、 'true'、' 42'、 'Some string' '、' {} '、' [] ' – Dan

1
data.presence && JSON.parse(data) 

JSON.parse(data.presence || '{}') 
関連する問題