2014-11-21 114 views
0

我有一個基本的Sinatra應用程序,它從PagerDuty接收一個webhook,抓取一些字段並在MongoDB中插入一個新文檔。通過JSON數組迭代 - Sinatra

post '/webhooks/pagerduty/' do 

    request.body.rewind 
    json = JSON.parse(request.body.read) 

    @pd_id = json["messages"][0]["data"]["incident"]["id"] 
    @ts = json["messages"][0]["data"]["incident"]["created_on"] 
    @status = json["messages"][0]["data"]["incident"]["status"] 
    @host = json["messages"][0]["data"]["incident"]["trigger_summary_data"]["HOSTNAME"] 
    @description = json["messages"][0]["data"]["incident"]["trigger_summary_data"]["SERVICEDESC"] 
    @state = json["messages"][0]["data"]["incident"]["trigger_summary_data"]["SERVICESTATE"] 

    # MongoDB connection code omitted 

    coll = db.collection('incidents') 

    _id = SecureRandom.hex 

    if @status != "resolved" 

    coll.insert({ :_id => _id, :pd_id => @pd_id, :ts => @ts, :status => @status, :host => @host, :description => @description, :state => @state, :db_type => @db_type }) 

    else 

    coll.update({ :pd_id => @pd_id }, { "$set" => { :status => @status }}) 

    end 

    status 200 

end 

這工作得很好,但問題是,有時PagerDuty發送陣列在多個JSON對象,我不知道如何調整代碼,並通過遍歷數組的數組中抓住了第一個對象,而不是一種乾的方式。

+0

爲什麼不展示JSON的最小示例,這樣我們就可以看到你在說什麼,而不是讓我們想象它呢? – 2014-11-21 17:32:17

+0

這只是一個JSON數組:{「messages」:[{「field」:「value」},{「field」:「value」}]} – kylemclaren 2014-11-22 22:05:32

回答

1

由於JSON.parse(request.body.read)["messages"]Array對象,因此您可以對其執行Array#each調用。

JSON.parse(request.body.read)["messages"].each do |element| 
    processed = process(element) 
    processed["status"] == "resolved" ? update(processed) : insert(processed) 
end 

def process(element) 
    # extract the required data from the json object 
    # return a Hash with the data 
end 

def insert(hash) 
    # insert 
end 

def update(hash) 
    # update 
end 
+0

非常感謝您的快速響應。我會試試這個,讓你知道:) – kylemclaren 2014-11-22 22:06:01