2015-10-16 29 views
1

我們正在嘗試閱讀Groovy中的流式JSON數據(使用JsonSlurper),但我們只能通過反覆解析源URL來設法實現。我們想要做的是將它作爲推送機制,以便任何時候有新的內容我們都會得到回覆。那可能嗎? (如果你有Java的解決方案,那也沒關係)閱讀Groovy中的流式JSON

package json 

import groovy.json.JsonParserType 
import groovy.json.JsonSlurper 

class JsonParser { 
    private static final String JSON_URL = "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20csv%20where%20url%3D'http%3A%2F%2Fdownload.finance.yahoo.com%2Fd%2Fquotes.csv%3Fs%3DHM-B.ST%26f%3Dsl1d1t1c1ohgv%26e%3D.csv'%20and%20columns%3D'symbol%2Cprice%2Cdate%2Ctime%2Cchange%2Ccol1%2Chigh%2Clow%2Ccol2'&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys" 

    static main(args) { 
     def url = new URL(JSON_URL) 
     def urlStream = null 
     try { 
      urlStream = url.openStream() 
      def jsonSlurper = new JsonSlurper().setType(JsonParserType.INDEX_OVERLAY) 
      def jsonObj = jsonSlurper.parse(url) 
      10.times { 
       println jsonObj.query.created.toString() 
       //println jsonObj.toString() 
       jsonObj = jsonSlurper.parse(url) 
       sleep(1000) 
      } 
     } finally { 
      if (urlStream != null) urlStream.close() 
     } 
    } 

} 

回答

1

爲了使用推送通知(亦稱了observer pattern),有什麼需要做的通知。由於網址沒有通知,因此您必須繼續進行投票。

不考慮線程的考慮因素,這裏有一個使用回調輪詢的簡單方法。

import groovy.json.JsonParserType 
import groovy.json.JsonSlurper 

final String JSON_URL = "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20csv%20where%20url%3D'http%3A%2F%2Fdownload.finance.yahoo.com%2Fd%2Fquotes.csv%3Fs%3DHM-B.ST%26f%3Dsl1d1t1c1ohgv%26e%3D.csv'%20and%20columns%3D'symbol%2Cprice%2Cdate%2Ctime%2Cchange%2Ccol1%2Chigh%2Clow%2Ccol2'&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys" 

poll(JSON_URL.toURL(), 5, 1000) { json -> 
    println json 
} 

def poll(URL url, int iterations, int interval, Closure callback) { 
    def jsonSlurper = new JsonSlurper().setType(JsonParserType.INDEX_OVERLAY) 
    def lastTimestamp = null 

    iterations.times { 
     def json = jsonSlurper.parse(url) 
     def timestamp = json.query.results.row.time 

     if(timestamp != lastTimestamp) callback(json) 
     lastTimestamp = timestamp 
     sleep(interval) 
    } 
} 

回調是閉包。

BONUS:只有在數據的時間戳發生變化時才調用回調。