42777


jsonでgetpositionsの"size"の値を取り出して認識させたいのですが、そのgetpositionsの値が空白の時エラーになってしまって、プログラムが止まってしまします。  
値が空白の時は0にしてエラーを回避するプログラムを書きたいのですがうまくいきません。。どうかよろしくお願いします。

[code]

    require "net/http"
    require "uri"
    require "openssl"
    require "json"
    
    key = "kkkkkkkk"
    secret = "kkkkkkkkk"
    
    timestamp = Time.now.to_i.to_s
    method = "GET"
    uri = URI.parse("kkkkkkkkkkkk")
    uri.path = "/v1/me/getpositions"
    uri.query = "product_code=kkkkkkkkkk"
    
    text = timestamp + method + uri.request_uri
    sign = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new("sha256"), secret, text)
    
    options = Net::HTTP::Get.new(uri.request_uri, initheader = {
                                 "ACCESS-KEY" => key,
                                 "ACCESS-TIMESTAMP" => timestamp,
                                 "ACCESS-SIGN" => sign,
                                 });
    
    https = Net::HTTP.new(uri.host, uri.port)
    https.use_ssl = true
    response = https.request(options)
    
    json = response.body
    getpositions = JSON.parse(json)
    getpositions || (getpositions = 0)
    puts getpositions[0]["size"]        # ここに値が入ってないとエラーになります。
    
[/code]

エラーコード

[code]

    size.rb:31:in `<main>': undefined method `[]' for nil:NilClass (NoMethodError)
    
[/code]


CC BY-SA 3.0
2018-03-30T02:44:30.057
42766
2018-03-30T06:20:57.507
2018-03-30T04:40:34.467
19110
27495
question
ruby json
値が空白の時でもエラーが出ないようにしたい


まず、空文字のjson(`[]`や`{}`)は、`||`演算子では`true`に判定されるため、

[code]

    getpositions || (getpositions = 0)
    
[/code]

のコードでは、0は代入されず`[]`のままです。

この時、`getpositions[0]`とすると`nil`が取得されるため、`["size"]`にアクセスした時、ご提示のエラーとなります。

もし、`getpositions`に0を代入したとしても、0に対して`["size"]`を取得することになるため、こちらもエラーとなります。

ですので、以下のように、三項演算子等で`getpositions`が空かどうかをチェックして`["size"]`にアクセスすると良いかと思います。

[code]

    json = response.body
    getpositions = JSON.parse(json)
    puts getpositions.empty? ? 0 : getpositions[0]["size"]
    
[/code]


CC BY-SA 3.0
2018-03-30T06:15:53.550
42777
2018-03-30T06:15:53.550
27930
42766
answer


単に `getpositions[0]` が `nil` のときの初期値を設定したいということであれば、`||=` を使うのはいかがですか？

[code]

    # 配列先頭のハッシュの "size" キーに対応する値があればそのまま、未定義・nil・false なら 0 が代入される。
    getpositions[0]["size"] ||= 0
    
[/code]


CC BY-SA 3.0
2018-03-30T06:19:21.477
42778
2018-03-30T06:19:21.477
19110
42766
answer


空のjson配列でもエラーなしで値をとる(値がない場合はnil)のは dig を使えば可能です。

[code]

    getpositions = []
    puts getpositions.dig(0, "size") || 0
    
[/code]

(Ruby 2.3 以上が必要です。)


CC BY-SA 3.0
2018-03-30T06:20:57.507
42779
2018-03-30T06:20:57.507
24823
42766
answer