从JSON输出构建数据结构

时间:2014-11-04 20:28:12

标签: ruby json file loops

嗨,我正致力于编写一个将数据从票务系统中提取出来的脚本。一旦它提取数据,它就会分析它的内容,如果内容与特定条件匹配,那么它需要构建一个将在同一服务器中转储的数据结构文件。

我能够以JSON格式解析数据,下面列出了内容:

[{"id"=>10423,
  "type"=>"Ticket",
  "lastUpdated"=>"2014-11-04T10:58:47Z",
  "shortSubject"=>"FOO STATUS UPDATE",
  "shortDetail"=>"Reply to this message if all systems are functional..",
  "displayClient"=>"No Client",
  "updateFlagType"=>0,
  "prettyLastUpdated"=>"54 minutes ago",
  "latestNote"=>
   {"id"=>16850,
    "type"=>"TechNote",
    "mobileListText"=>"<b>t. trust: </b> All Systems are OK",
    "noteColor"=>"clear",
    "noteClass"=>"bubble right"}},

 {"id"=>10422,
  "type"=>"Ticket",
  "lastUpdated"=>"2014-11-04T10:54:07Z",
  "shortSubject"=>"FOO STATUS UPDATE",
  "shortDetail"=>"Reply to this message if all systems are functional..",
  "displayClient"=>"No Client",
  "updateFlagType"=>0,
  "prettyLastUpdated"=>"58 minutes ago",
  "latestNote"=>nil},

 {"id"=>10421,
  "type"=>"Ticket",
  "lastUpdated"=>"2014-11-04T10:53:17Z",
  "shortSubject"=>"FOO STATUS UPDATE",
  "shortDetail"=>"Reply to this message if all systems are functional..",
  "displayClient"=>"No Client",
  "updateFlagType"=>0,
  "prettyLastUpdated"=>"59 minutes ago",
  "latestNote"=>nil}]

在上面的数据中,你可以看到每张票都有一个id,lastupdate,short主题,简短的细节和最新的注释,如果没有人回复票,但是如果有人回复那么最新音符的值将是nill值mobileListText将有一些东西。

所以我需要做的就是,一旦我得到这些数据,脚本将查找符合“FOO STATUS UPDATE”的主题,如果该值匹配则查找shortDetail匹配的内容“回复此消息如果所有系统都正常运行..“如果这符合,则查找其最新的注释,如果latestNote是nill,那么它将创建一个日志文件,指定运行时的日期和时间,具有此状态的票证的id和消息说明,票证没有回复,但如果最新票据的值为“mobileListText”=&gt;“ t。信任:所有系统都正常”,则创建以下数据结构:

{"LastUpdate":1415130257,"Service":[{"time":"11-04-2014 10:58:47 GMT","region:":"","id":"","description":"All Systems are OK","service":""},{"time":"11-04-2014 10:54:07 GMT","region:":"","id":"","description":"All Systems are OK","service":""},{"time":"11-04-2014 10:53:17 GMT","region:":"","id":"","description":"All Systems are OK","service":""}]}

我能够拥有部分内容但是,根据上面的数据,只有一张票可以使所有系统都正常,只是其中一张票正在回复,并且它只应该这样写:

{"LastUpdate":1415130257,"Service":[{"time":"11-04-2014 10:58:47 GMT","region:":"","id":"","description":"All Systems are OK","service":""}]}

但是反而只重复这张已被回复几次的票。

到目前为止我的代码:

require 'rubygems'
require 'json'
require 'net/http'
require 'highline/import'
require 'pp'
require 'logger'



@usersol='foo'
@passol= 'foo123'
@urlsol= "http://dev-webhelpdesk.foo.corp:8081/helpdesk/WebObjects/Helpdesk.woa/ra/Tickets?list=group&page=1&limit=#{@limit}&username=#{@usersol}&password=#{@passol}"
@limit = '25'
@log = @log= Logger.new( 'message_solar.log')






 def ticket_data                                              #looks for ticket data in solarwinds
    resp = Net::HTTP.get_response(URI.parse(@urlsol))
    url_output = resp.body
    JSON.parse(url_output)
  end

#CRONJOB THAT START ALL
#echo "Reply to this message if all systems are functional.." | mail -r noc@foo.com  -s "FOO STATUS UPDATE:" noc-team@FOO.com >> /dev/null
                                          # Looking for all the tickets  with the following content
                                          # ticket id, ticket subject and content
  def search_allok(allok)
    description = []
    allok.each do |systems|
      output1 = systems.has_key?'id'
      if output1
        systems.values_at('shortSubject').each do | subject |
         output2 = subject.match(%r(TRUST STATUS UPDATE))
         if output2
           latestnote = systems.values_at('latestNote')
           latestnote.each do |content|
            if content
             final = content.values_at('mobileListText')
             final_ok = final[0].sub!(/^\<b\>.*\<\/b\>\s/, "")
             systems_ok = final_ok.match(%r(All Systems are OK))
                if systems_ok
                  ids = systems['id']
                  notify = {"LastUpdate" => Time.now.to_i, "Service" => []}
                  allok.each do |lastup|
                    reference = lastup.has_key? 'id'
                    if reference
                      timeid = lastup.values_at('lastUpdated')
                      timeid.each do |lines|
                        final=lines.split(/[-, T, Z]/)
                        notify["Service"] << { "time" => "#{final[1]}-#{final[2]}-#{final[0]} #{final[3]} GMT", "region:" => "", "id" => "#{ids}", "description" => "#{systems_ok}" , "service" => ''}
                      end
                    end
                  end
                  File.open("notify.json", "w") do |fileformatted|
                    fileformatted.puts (JSON.dump(notify))
                  end
                 else
                  time = Time.now
                  @log.info("#{time} - Ticket ID #{systems['id']} has not being updated")
                end
            else
              @log.info("#{time} - Ticket ID #{systems['id']} has not being reply")
            end
           end
         end
       end
      end
    end
  end







                                    # If the content is there then it need to create
                                    # the data structure including the lastupdated                                                    
                                    # (time when it run the script), and the lastupdate for the ticket                                                                                  
                                    # and the description All Systems OK

#This method below I added to the one above, but I was thinking on doing it separate but I encouter issues passing the information needed from above to below

  def datastructure(format_file)            #creates JSON file lastupdated of each ticket in the queue
    notify = {"LastUpdate" => Time.now.to_i, "Service" => []}
     format_file.each do |lastup|
       reference = lastup.has_key? 'id'
       if reference
         timeid = lastup.values_at('lastUpdated')
         timeid.each do |lines|
          final=lines.split(/[-, T, Z]/)
            notify["Service"] << { "time" => "#{final[1]}-#{final[2]}-#{final[0]} #{final[3]} GMT", "region:" => "", "id" => "", "description" => region , "service" => ''}
         end
       end
    end
    File.open("notify.json", "w") do |fileformatted|
      fileformatted.puts (JSON.dump(notify))
    end
  end

#ticket_data
#datastructure(ticket_data)
search_allok(ticket_data)

1 个答案:

答案 0 :(得分:0)

您编写的代码基本上是使用ruby的map和select方法实现的迂回版本。请参阅此文章:Ruby Explained: Map, Select, and Other Enumerable Methods