

railsでウェブサイトを作っています。

その中にJSONをパースする処理があります。  
これ自体はうまく言っているのですが、わざと変な文字を与えると`JSON::ParserError`となってしまい、エラー画面になります。

「パースエラーの場合はこうする」といった処理を書きたいのですが、どうやってやればよいのでしょうか。


CC BY-SA 3.0
2015-05-01T08:41:52.933
9740
2015-05-02T15:19:39.217
9149
question
ruby-on-rails ruby json
JSON::ParserErrorをハンドリングしたい


Ruby で例外 (`JSON::ParserError` など) を捕捉するには、`rescue` を利用します。

[code]

    require "json"
    
    json = '{"fate": "testarossa'
    begin
      hash = JSON.parse(json)
      p hash
    rescue JSON::ParserError => e
      $stderr.puts "ERROR: #{e}"
    end
    
[/code]

`rescue` については、<http://docs.ruby-
lang.org/ja/2.1.0/doc/spec=2fcontrol.html#begin> を参照してください。


CC BY-SA 3.0
2015-05-01T09:36:13.793
9742
2015-05-01T09:36:13.793
76
9740
answer


既に基本的な回答は出ていますが、補足で別解もあり得るという例を示したいと思います。

[code]

    require 'json'
    
    s = '{"abc": "aaa"'
    s2 = '{"abc": "aaa"}'
    
    t = JSON.parse(s) rescue nil  # t にnilが代入
    t = JSON.parse(s2) rescue nil # t に{abc: 'aaa'} が代入
    
[/code]


CC BY-SA 3.0
2015-05-01T09:48:29.733
9743
2015-05-01T09:48:29.733
9403
9740
answer


ウェブサイトを作っていて、変な文字を与えた時にエラー画面になるということは、フォームでJSON形式のテキストを入力していて、そのエラー処理を行いたいということでしょうか？

scaffoldで、たとえば以下のようなモデルを作成したとします。

[code]

    rails g scaffold JsonArticle body:text
    
[/code]

その場合、`app/models/json_article.rb`
に次のようなvalidationを追加すれば、フォームの入力に対してエラー表示を出すことが出来ます。

[code]

    class JsonArticle < ActiveRecord::Base
      validates_each :body do |r,a,v|
        json = JSON.parse v rescue nil
        r.errors.add a, "JSONのフォーマットが正しくありません" if json.nil?
      end
    end
    
[/code]

![JSONのパース失敗画面](https://i.stack.imgur.com/VQIdV.png)


CC BY-SA 3.0
2015-05-02T15:19:39.217
9781
2015-05-02T15:19:39.217
9508
9740
answer